在类中,像下面这样,doActionOne()
和doActionTwo()
所需的唯一测试是确保它们使用正确的参数委托给doAction()
。
由于委托doAction(String a, int b, boolean c)
方法需要大量的设置,所以任何解决方案都应该防止调用真正的方法。
public class ClassUnderTest {
public void doActionOne(String a, int b) {
doAction(a, b, true);
}
public void doActionTwo(String a, int b) {
doAction(a, b, false);
}
public void doAction(String a, int b, boolean c) {
//already tested
}
}
这样的测试似乎需要某种局部的模拟或间谍,但是我无法得到正确的答案。
测试应该如下所示,尽管这种方法不起作用。
@Test
public void testDoActionOne(){
ClassUnderTest cut = Mockito.mock(ClassUnderTest.class);
//call the real method
when(cut.doActionOne("A1", 1)).thenCallRealMethod();
//test delegate called with correct params
verify(cut, times(1)).doAction("A1", 1, true); //fails wanted but not invoked
}
不确定我是否需要这样的东西:
发布于 2015-11-18 10:09:11
我知道有两种方法。一种方法是创建一个匿名内部类,其中覆盖不想测试的方法。这不涉及任何莫奇托魔法。另一种方法是使用Mockito对象,这是一个真实实例的代理,允许您为某些方法指定存根行为,并让其他方法传递到实际实例。
方法1,使用匿名内部类:
public class MyTest {
private String a;
private String b;
private boolean c;
private ClassUnderTest instance = new ClassUnderTest() {
@Override
public void doAction(String a, int b, boolean c) {
MyTest.this.a = a;
MyTest.this.b = b;
MyTest.this.c = c;
}
}
public void test() {
// SETUP
String expectedA = "test value A";
String expectedB = "test value B";
boolean expectedC = true;
// CALL
instance.doActionOne(expectedA, expectedB);
// VERIFY
assertEquals(expectedA, a);
assertEquals(expectedB, b);
assertEquals(expectedC , c);
}
方法2,使用Mockito间谍对象:
@RunWith(MockitoJUnitRunner.class)
public class MyTest {
@Spy
private ClassUnderTest instance;
public void test() {
// SETUP
String expectedA = "test value A";
String expectedB = "test value B";
boolean expectedC = true;
doNothing().when(instance).doAction(expectedA , expectedB, expectedC);
// CALL
instance.doActionOne(expectedA, expectedB);
// VERIFY
verify(instance, times(1)).doAction(expectedA , expectedB, expectedC);
}
因为间谍是由Mockito控制的代理,所以您也可以验证是否在间谍上调用了方法,这正是您在这里需要的。您还可以为doAction指定一个存根返回值(如果它不是一个void方法):
// SETUP
doReturn("stubbed value").when(instance).doAction(expectedA , expectedB, expectedC);
发布于 2015-11-18 10:10:58
事情是这样的:
when(object.getFieldValue(attribute)).thenReturn(NESTED_ID);
verify(object, times(1)).getFieldValue(eq(attribute));
https://stackoverflow.com/questions/33776716
复制相似问题