繁体   English   中英

在 JAVA 中使用 Mockito 模拟依赖类

[英]Mocking a dependent class using Mockito in JAVA

我对 Mockito 很陌生。 如果我的问题听起来很愚蠢,我深表歉意。 我有一个独立的 JAVA 应用程序,我必须使用 JUnit 和 Mockito 为其编写单元测试用例。 重要的是我无法更改代码,因为它是由其他人编写的并且集成测试已经完成。 我试图搜索类似的问题,但找不到任何东西。 在有些类似的问题中提出的解决方案没有用:(

我附上了流程控制图。我想模拟依赖类。 例如,当我对“Class 1 --> Method 1”进行单元测试时,我想在不调用它的情况下模拟“Class 2 中的 Method 2”的输出。 我曾尝试使用 Mockito.when 和 Mockito.doReturn。 两者都调用依赖方法。

有人可以建议我一些想法来实现这一目标吗?

控制流程

//Pseudocode of Class 1
public class Class1 {
    public boolean method1() {
        Class2 c2 = new Class2();
        boolean b1 = c2.method2();
    }
}

//Pseudocode of Class 2
public class Class2 {
    public boolean method2() {
        Class3 c3 = new Class3();
        boolean b2 = c3.method3();
    }
}

... Likewise same for Class 3, 4 and 5

你被要求做的是为逻辑编写单元测试,这是由一个对编写测试能力代码一无所知的人编写的。 可能是一个编写代码很长时间的开发人员,以“老派”的方式做事,并认为他太重要而不能编写单元测试。 编写您正在测试的逻辑的人需要回到学校学习一些新技巧。

无论如何这对你没有帮助,所以你仍然可以对这个逻辑进行单元测试,只是更痛苦。 单独使用 Mockito 是做不到的,您需要“PowerMockito”,它可以让您模拟 Class2 的构造。

首先,您需要将 2 个新的测试依赖项添加到您的项目“powermock-api-mockito”+“powermock-module-junit4”。

您的案例的测试类将如下所示:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Class1.class)
public class Class1Test {
    private Class1 testSubject;

    @Mock 
    private Class2 class2;

    @Test
    public void testMethod1() throws Exception {
        testSubject.method1();
        verify(class2).method2();
    }

    @Before 
    public void setup() throws Exception {
        MockitoAnnotations.initMocks(this);
        PowerMockito.whenNew(Class2.class).withNoArguments().thenReturn(class2);
        testSubject = new Class1();
    }
}

因此,正如您所看到的,PowerMockito 允许您使用PowerMockito.whenNew()模拟新 Class2 实例的构造,这仅在您使用注释@PrepareForTest(Class1.class) “准备” Class1 @PrepareForTest(Class1.class)否则 Class1 不能注入模拟 Class2 实例。 希望这为您指明了正确的方向? 附带说明一下,如果你是一名初级开发人员,被要求为更高级的开发人员编写单元测试,现在就滚出去,你的开发团队很烂!

有时,代码不是为了可测试而编写的。

特别是在方法或其他构造函数中调用构造函数是单元测试和模拟的一个大问题。

如果您不以任何方式使用工厂或依赖倒置/依赖注入,您将很难测试代码。 这也是 CDI 如此受欢迎的原因之一。

无论如何,在集成测试已经到位之后被要求编写单元测试是一种不好的味道。 您应该先编写单元测试。 如果您遵循测试驱动开发 (TDD),那么您甚至应该在实际编写类之前编写测试。 这样,就不可能编写难以测试的类。

但是在你已经搞砸的情况下该怎么办?

  • 我建议重构您的代码。 不要在方法中调用构造函数,而是将实例传递到方法中,或者在类中提供一个字段以便能够模拟它。
  • 重新考虑单元测试的范围。 它应该只测试一个类。 其他一切,所有依赖项都应该被嘲笑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM