【发布时间】:2019-07-10 11:23:45
【问题描述】:
我必须像这样在某个类中测试一个方法:
public class aClassToTest{
private SomeService someService = new SomeService();
public String methodToTest(){
String data = someService.getData();
//....
}
}
所以,我模拟了 SomeService 类以返回我的模拟对象而不是原始的 SomeService 对象。我在每个@Test 方法中都通过 PowerMockito 完成了这项工作
SomeService someServiceMock = mock(SomeService.class);
when(someServiceMock.getData().thenReturn(Data myMockedData)
PowerMockito.whenNew(SomeService.class).withAnyArguments().thenReturn(someServiceMock);
我的测试类上方有这个注释:
@PrepareForTest({aClassToTest.class, SomeService.class})
如果只有一个测试它工作正常,但如果有几个测试someServiceMock.getData() 每次都会返回第一个测试的数据,尽管我在每次测试中都使用新数据模拟它。我尝试在每个@Test 方法上方添加注释@PrepareForTest({aClassToTest.class, SomeService.class}),但现在经过几次测试后我有了OutOfMemoryError,现在它只有在我使用所有测试方法运行整个Test 类时才有效,但如果我运行分别测试方法我有No tests found for given includes 错误。
我有这样的测试类:
@RunWith(PowerMock.class)
@PrepareForTest({aClassToTest.class, SomeService.class})
public class TestClass{
private void doMockSomeService(String testData){
SomeService someServiceMock = mock(SomeService.class);
when(someServiceMock.getData().thenReturn(testData);
PowerMockito.whenNew(SomeService.class).withAnyArguments().thenReturn(someServiceMock);
}
@Test
public void testCase1(){
String expectedResult = "expectedResult1";
doMockSomeService("123");
ClassToTest classToTest = new ClassToTest();
String result = classToTest.methodToTest();
assertEquals(result, expectedResult);
}
@Test
public void testCase2(){
String expectedResult = "expectedResult2";
doMockSomeService("456");
ClassToTest classToTest = new ClassToTest();
String result = classToTest.methodToTest();
assertEquals(result, expectedResult);
}
}
在这种情况下,someService.getData() 的返回值总是“123”。
【问题讨论】:
-
您可能应该发布完整的测试课程,但不清楚您在做什么 - 听起来像是最简单的情况。另外,您使用 Mockito 还是 Powermock?
-
我将 Mockito 用于常规模拟对象,使用 PowerMock 模拟创建新对象和模拟静态
-
@fonzy 如果没有 minimal reproducible example 来澄清您的具体问题或其他详细信息以准确突出所做的工作,则很难重现问题,从而更好地理解所询问的内容。
标签: java junit mockito powermock powermockito