Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JAVA中使用Mockito模拟依赖类_Java_Mockito_Powermock_Stub - Fatal编程技术网

在JAVA中使用Mockito模拟依赖类

在JAVA中使用Mockito模拟依赖类,java,mockito,powermock,stub,Java,Mockito,Powermock,Stub,我对莫基托很陌生。如果我的问题听起来很愚蠢,我道歉。我有一个独立的JAVA应用程序,我必须使用JUnit和Mockito为其编写单元测试用例。重要的是,我不能更改代码,因为它是由其他人编写的,并且集成测试已经完成。我试图寻找类似的问题,但什么也找不到。在一些类似问题中提出的解决方案不起作用:( 我已经附加了流控制图。我想模拟依赖类。例如,当我对“类1-->方法1”进行单元测试时,我想模拟“类2中的方法2”的输出,而不调用它。我尝试使用Mockito.when和Mockito.doReturn。两

我对莫基托很陌生。如果我的问题听起来很愚蠢,我道歉。我有一个独立的JAVA应用程序,我必须使用JUnit和Mockito为其编写单元测试用例。重要的是,我不能更改代码,因为它是由其他人编写的,并且集成测试已经完成。我试图寻找类似的问题,但什么也找不到。在一些类似问题中提出的解决方案不起作用:(

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

有人能给我一些实现这一目标的建议吗

//类1的伪代码
公共班级1{
公共布尔方法1(){
Class2 c2=新的Class2();
布尔b1=c2.method2();
}
}
//第2类伪码
公共课2{
公共布尔方法2(){
Class3 c3=新的Class3();
布尔b2=c3.method3();
}
}
…第3类、第4类和第5类也是如此

有时,编写代码不是为了测试

特别是在方法内部调用构造函数或其他构造函数对于单元测试和模拟来说是一个大问题

如果您不以任何方式使用工厂或依赖项反转/依赖项注入,您将很难测试代码。这就是CDI如此流行的原因之一

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

但是对于你已经一团糟的处境该怎么办呢

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

你被要求做的是为逻辑编写单元测试,这是由一个完全不懂为测试能力编写代码的人编写的。可能是一个编写代码很长时间的开发人员,在“老派”中做事不管是谁写了你要测试的逻辑,他都需要回到学校学习一些新的技巧

无论如何,这对你没有帮助,所以你仍然可以对这个逻辑进行单元测试,这更痛苦。Mockito本身无法做到这一点,你需要“PowerMockito”,它可以让你模拟Class2的构造

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

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

@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时才起作用
否则Class1无法注入模拟Class2实例。希望这能为您指明正确的方向?另一方面,如果您是一名初级开发人员,被要求为一名更高级的开发人员编写单元测试,请立即离开,您的开发团队已经烂了!

您能分享您的测试代码吗?问题是您没有使用依赖关系注入。如果您自己通过调用构造函数初始化bean,那么很难对其进行模拟。这正是使用依赖项注入的原因。如果不使用PowerMock,我看不到有一个完整功能实现和集成测试后编写单元测试的方法,这是一件非常糟糕的事情。基本上,我我的意思是:你用错误的方式做。或者有人强迫你用错误的方式做:(非常感谢John Stringer。这正是我一直在寻找的。它成功了。虽然这个答案使测试成为可能,但也不是一个好主意。相反,重构代码,使测试变得容易,并学会如何在过程中正确设计软件。至少这将是我对我指导的每个人的建议.