我有要通过Mockito和PowerMock进行测试的此类:
public class CoolObject {
private int myPrivateCode = 115;
public String getSaltedUrl(String url) {
return String.format("%s?salt=%d", url, getSalt());
}
private long getSalt() {
return System.currentTimeMillis() * myPrivateCode;
}
}
我编写了此测试,该测试试图模拟私有getSalt
方法以始终返回10
。
import static org.powermock.api.mockito.PowerMockito.spy;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.testng.Assert.*;
import org.testng.annotations.Test;
class CoolObjectTest {
@Test
public void testSalt() throws Exception {
CoolObject obj = spy(new CoolObject());
when(
obj,
"getSalt"
).thenReturn(10);
assertEquals(obj.getSaltedUrl("https://www.google.com/"), "https://www.google.com/?salt=10");
}
}
我得到的输出是这个:
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
我正在使用Java8和这些依赖项进行测试:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.28.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-testng</artifactId>
<version>2.0.4</version>
<scope>test</scope>
</dependency>
除了使用TestNG代替JUnit之外,我正在使用的代码似乎与here所示的代码兼容。
我想念什么?
您缺少ObjectFactory
的TestNG
定义,有关更多详细信息,请检查wiki。
也要返回int
而不是long
。
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.testng.Assert;
import org.testng.IObjectFactory;
import org.testng.annotations.ObjectFactory;
import org.testng.annotations.Test;
@PrepareForTest(CoolObject.class)
public class CoolObjectTest {
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new org.powermock.modules.testng.PowerMockObjectFactory();
}
@Test
public void testSalt() throws Exception {
CoolObject obj = PowerMockito.spy(new CoolObject());
PowerMockito.when(
obj,
"getSalt"
).thenReturn(10l);
Assert.assertEquals(obj.getSaltedUrl("https://www.google.com/"), "https://www.google.com/?salt=10");
}
}