假设我有3个类,ClassA包含ClassB,ClassC包含ClassB。我试图在ClassA中测试一个方法,该方法需要调用ClassB来获取ClassC的实例,并在ClassC中执行一个无效的方法(我知道这是错误的,因为ClassA不应该知道ClassC,代码气味,这不是我的代码,只是试图创建一个测试)。然而,当我尝试使用Mockito跳过该方法调用时。无论怎样,我都会遇到以下错误:
org.mockito.exceptions.misusing.UnfinishedStubbingException:
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, you naughty developer!
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed
这是代码:
A类:
public class ClassA {
private ClassB classB;
public ClassA(ClassB classB) {
this.classB = classB;
}
public void methodToTest() {
classB.getClassC().someVoidMethod("123");
}
}
B类:
public class ClassB {
private ClassC classC;
public ClassB(ClassC classC) {
this.classC = classC;
}
public ClassC getClassC() {
return classC;
}
}
C类:
public class ClassC {
public void someVoidMethod(String arg) {
System.out.println(arg);
}
}
考试班
@RunWith(MockitoJUnitRunner.class)
public class ClassATest {
@InjectMocks
private ClassA classA;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private ClassB classB;
@Mock
private ClassC classC;
@Test
public void test() {
Mockito.doNothing().when(classB.getClassC()).someVoidMethod("123");
}
}
再说一次,这段代码不是我的,所以我不能修改它使用依赖关系的方式。我只是想测试一下。
提示:Mockito。当(…)。然后返回(…)很好,但这不是我的情况,因为我试图模仿的方法是无效的。
您的mocking语法排列不当。
Mockito.doNothing().when(classB.getClassC()).someVoidMethod("123");
当你将空格添加到这个语句的各个部分时,这是显而易见的。
Mockito response method method
Mockito .doNothing() .when(classB.getClassC()) .someVoidMethod("123");
当您将一个METHOD传递给当时时,它期望一个然后返回
当您将一个OBJECT传递给当时时,您可以从中链接一个无效方法。
Mockito.when(classB.getClassC()).thenReturn(classC);
Mockito.doNothing().when(classC).someVoidMethod("123");
这不能像你想象的那样工作是因为classB。getClassC()
在通过when()
时不像getter那样工作。
实际上,您并没有将对对象的引用传递给Mockito,而是Mockito将使用和
为您存根的方法,它抱怨缺少该方法,因为您没有一个。
tl: dr;
不要像对待mockito存根代码中的实际方法那样对待模拟对象方法。
我认为这行得通。我不知道为什么你不能使用class B. getClassC()
而不是直接引用class C
。
@RunWith(MockitoJUnitRunner.class)
public class ClassATest {
@InjectMocks
private ClassA classA;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private ClassB classB;
@Mock
private ClassC classC;
@Before
public void init() {
doReturn(classC).when(classB).getClassC();
doNothing().when(classC).someVoidMethod("123");
}
@Test
public void test() {
classA.methodToTest();
}
}
此代码在控制台中有以下输出: Method1 Method2 Method3 而我希望它是 Method1 Method2 Mock method3 方法3被嘲弄了,那么为什么它没有被调用呢?
1、后端开发代码 public void methodA(){ } 2、测试方法代码 public void methodATest(){ Mockito.when(mapper.insert(Mockito.any())).thenReturn(1); xxx.methodA(); Mockito.when(mapper.insert(Mockito.any())).thenThrow(Runt
如果我们不想付出构建语法分析树的开销,或者想要在分析期间动态地计算值或把东西打印出来,那么可以通过在语法中嵌入任意代码实现。它的比较困难的,因为我们必须明白在语法分析器上的操作的影响,以及在哪里放置这些操作。 为了解释嵌入在语法中的操作,让我们先来看下文件rows.txt中的数据: parrt Terence Parr 101 tombu Tom Burns 020 bk
我想通过模拟class的重写方法a1方法2来测试我的服务。我不想更改课程A1和B1中的任何内容。我使用的是mockito 1.9.0和powermockito 1.4.12。我正在尝试以下代码: UnitTestService类: 服务级别: A1类: B1级: 我正在eclipse中使用testNG运行类UnitTestService。在这里,B1类a1Method2中的实际方法在控制台中打印“
问题内容: 我有四个让我们说A,B,C,D的类,每个类都从另一个调用方法。 现在我已经模拟了类A,并且想模拟使用嘲笑的方法 并希望在递归方法调用上获取“ foo” 应该回来 我试过了 when(a.getB()。getC()。getD())。thenReturn(“ foo”); 但是得到了nullPointerException 然后我尝试 doReturn(“ foo”)。when(a.get
我有4个类让说A,B,C,D,每一个调用的方法从另一个。 现在我已经模拟了类A,并想使用mockito模拟一个方法 但得到nullPointerException 然后我试着 doReturn(“foo”).When(A.getb().getc().getd()); 但我不能一次就做到吗?如有任何帮助,我们将不胜感激。