java - 使用 Mockito 测试委托(delegate)方法

标签 java unit-testing mockito

在如下所示的类中,围绕 doActionOne()doActionTwo() 所需的唯一测试是确保它们委托(delegate)给 doAction() code> 使用正确的参数。

由于委托(delegate) 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
    }
}

这样的测试似乎需要某种部分模拟或 spy ,但我无法得到正确的结果。

尽管这种方法不起作用,但测试应如下所示。

@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
}

不确定我是否需要这样的东西:

http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/AdditionalAnswers.html#delegatesTo(java.lang.Object)

最佳答案

我知道有两种方法可以做到这一点。一种方法是创建一个匿名内部类,在其中重写您不想测试的方法。这不涉及任何 Mockito 魔法。另一种方法是使用 Mockito Spy 对象,这是真实实例的代理,允许您为某些方法指定 stub 行为,并让其他方法落入真实实例。

方法一,使用匿名内部类:

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 spy 对象:

@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);
    }

因为 spy 是 Mockito 控制的代理,所以您还可以验证是否在 spy 上调用了方法,这正是您所需要的。您还可以为 doAction 指定一个 stub 返回值(如果它不是 void 方法):

        // SETUP
        doReturn("stubbed value").when(instance).doAction(expectedA , expectedB, expectedC);

关于java - 使用 Mockito 测试委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33776716/

相关文章:

java - 重写接口(interface)中的内部类方法

java - 在 Mockito doReturn 方法中指定传递给方法的特定枚举

java - Mockito 单元测试 - 时间戳不同

java - 将 Mockito 用于 HTTP 客户端

java - Apache Commons net 中的 execProt ("P"是什么?

java - 为每个选择元素设置值 - Java Selenium WebDriver

java - 如何在@Configuration中模拟用@PropertySource注入(inject)的.properties文件?

python - 在单元测试结束之前,assertRaises 中的函数会完成吗?

java - JMockit @Mocked 注解导致其他测试失败

java - (JSF 2.0) primefaces dataTable 组件的问题。