gpt4 book ai didi

java - @RunWith(PowerMockRunner.class) 与@RunWith(MockitoJUnitRunner.class)

转载 作者:太空狗 更新时间:2023-10-29 22:39:35 29 4
gpt4 key购买 nike

在通常使用 @Mock@InjectMocks 注释的模拟中,被测类应该使用 @RunWith(MockitoJUnitRunner.class)

@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {

@Mock
private TaskService mockTaskService;

@InjectMocks
private ReportServiceImpl service;

// Some tests
}

但在某些示例中,我看到正在使用 @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
}
}

有人可以指出有什么区别以及我什么时候想使用一个而不是另一个吗?

最佳答案

乍一看,答案很简单:好吧,有几种模拟框架,而且有不同的使用方法。

第一个示例告诉 JUnit 使用 Mockito 模拟框架提供的“单元测试运行器”。第二个示例使用 PowerMock 框架中的单元测试运行器。

为了让事情变得有意义,您还需要不同的导入语句,因为这两个框架对 @Mock 注释都有不同的实现。

(使用这些特定于框架的测试运行器的要点是它们负责使用特定于框架的特殊注释初始化所有字段)。

所以:这里的区别很简单:第一个示例是使用 Mockito 框架编写的,第二个使用 PowerMock。

现在,使用哪一个?

答案:Mockito。

为什么?不知何故,一个丑陋的事实是:PowerMock-one 基本上是在求救。它说“被测类设计不当,请修复”。含义:作为开发人员,您可以编写“易于测试”的代码,也可以编写“难以测试”的代码。许多人做第二种:他们编写难以测试的代码。然后,PowerMock(ito) 提供了仍然测试该代码的方法。

PowerMock(ito) 使您能够模拟(从而控制)对static 方法和new() 的调用。为了实现这一点,PowerMock(ito) 操纵您的被测代码 的字节代码。这对于小型代码库来说完全没问题,但是当您面对数百万行生产代码和数千个单元测试时,情况就完全不同了。

我看到许多 PowerMock 测试无缘无故失败,数小时后才发现……其他地方的一些“静态”东西发生了变化,并且以某种方式影响了不同的 PowerMock 静态/新驱动测试用例。

在某些时候,我们的团队做出了一个有意识的决定:当您编写新代码时,您只能使用 PowerMock 对其进行测试……这是 Not Acceptable 。从那时起,我们只创建了 Mockito 测试用例,此后我们再也没有看到类似的怪异问题困扰我们 PowerMock。

使用 PowerMock 的唯一可接受的原因是当您想要测试您不想修改的现有(可能是第 3 方)代码时。但是当然,测试这样的代码有什么意义呢?当您无法修改该代码时,为什么测试会突然失败?

关于java - @RunWith(PowerMockRunner.class) 与@RunWith(MockitoJUnitRunner.class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38268929/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com