Joh*_*han 17 java mocking mockito powermockito
在通常使用@Mock
和@InjectMocks
注释的模拟中,测试中的类应该运行@RunWith(MockitoJUnitRunner.class)
.
@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {
@Mock
private TaskService mockTaskService;
@InjectMocks
private ReportServiceImpl service;
// Some tests
}
Run Code Online (Sandbox Code Playgroud)
但在某些例子中,我看到@RunWith(PowerMockRunner.class)
被使用:
@RunWith(PowerMockRunner.class)
public class Tests {
@Mock
private ISomething mockedSomething;
@Test
public void test1() {
// Is the value of mockedSomething here
}
@Test
public void test2() {
// Is a new value of mockedSomething here
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以指出它的差异是什么时候我想用一个而不是另一个?
Gho*_*ica 23
乍一看,答案很简单:好吧,那里有几个模拟框架.
但丑陋的事实是:PowerMock-one基本上是一个求助的呼声.它说"被测试的课程很糟糕,请修理它".
认真; PowerMock允许您测试无法使用其他模拟框架测试的代码:它接受您的生产类(因此来自您的源的字节代码)并操纵它们以允许模拟静态方法或最终类/方法.这可能听起来不太糟糕,但请相信我:确实如此.
首先,这意味着PowerMock不会测试您的类,而是测试PowerMock 操作的类.然后:它(或多或少完全)杀死你运行覆盖工具的能力.
最糟糕的是:为奇怪的失败做准备,你不明白,你可以调试几个小时,永远不会发现你的代码有任何问题.特别是当您已经在使用其他执行字节码操作的框架时.
因此,实质上:有时,设计的实施方式使其无法进行测试.然后有些人决定使用PowerMock来克服这些问题,仍然可以进行测试.
但在我看来:你不应该转向PowerMock,而应该改变你的设计,并解决那些让你要求PowerMock的问题.
使用PowerMock的唯一可接受的原因是您想要测试您不想修改的现有(可能是第三方)代码.但当然,测试此类代码的重点是什么?当您无法修改该代码时,为什么测试会突然失败?
归档时间: |
|
查看次数: |
18231 次 |
最近记录: |