Kid*_*rla 2 java junit unit-testing mockito
我试图一起使用两个Mockito模式:
Mockito.spy
.Mockito.doXXX(...).when(mock).method(matchers)
,因为Mockito.when(mock.method(matchers))
出于显而易见的原因你不能使用语法(method
返回void所以不能作为参数传递)结合它们时,我面临着一个问题NotAMockException
.下面是一个(人为的)示例,我使用PowerMockito 1.6.2(= Mockito 1.10.19)和JUnit 4.12进行了测试,并重现了该问题.
public class Greeter { // this is the class we will be partially mocking
public void helloWorld(String hello, Set<String> set) {
set.add("Hello: "+hello);
}
public void goodbyeWorld(String goodbye, Set<String> set) {
set.add("Goodbye: "+goodbye);
}
}
public class ExampleClass { // this is the class under test
public String helloGoodbye(String input, Greeter greeter) {
Set<String> helloSet = new HashSet<String>();
Set<String> goodbyeSet = new HashSet<String>();
greeter.helloWorld(input, helloSet);
greeter.goodbyeWorld(input, goodbyeSet);
return (helloSet.iterator().next() + ", " + goodbyeSet.iterator().next());
}
}
public class ExampleClassTest {
@Test
public void test() {
Greeter greeter = new Greeter();
Mockito.spy(greeter);
Mockito.doAnswer(new Answer(){ // exception thrown points to this line
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
((Set<String>)invocation.getArguments()[1]).add("Bonjour: " + invocation.getArguments()[0]);
return null;
}
}).when(greeter).helloWorld(Mockito.any(String.class), Mockito.any(Set.class));
ExampleClass example = new ExampleClass();
String aggregateGreeting = example.helloGoodbye("Mars", greeter);
Assert.assertEquals("Bonjour: Mars, Goodbye: Mars", aggregateGreeting);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的完整错误:
org.mockito.exceptions.misusing.NotAMockException:
Argument passed to when() is not a mock!
Example of correct stubbing:
doThrow(new RuntimeException()).when(mock).someMethod();
at com.example.ajb.pmv.ExampleClassTest.test(ExampleClassTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Process finished with exit code -1
Run Code Online (Sandbox Code Playgroud)
任何变通方法(其他方法来实现在类中模拟单个void方法的目标)也将受到欢迎!
JB *_*zet 10
你没有把间谍传给你when()
.你正在传递原始对象.
改变线
Mockito.spy(greeter);
Run Code Online (Sandbox Code Playgroud)
至
greeter = Mockito.spy(greeter);
Run Code Online (Sandbox Code Playgroud)
Mockito.spy()
创建一个间谍对象,它是原始对象的副本.它不会修改原始对象.
归档时间: |
|
查看次数: |
4530 次 |
最近记录: |