gpt4 book ai didi

java - Mockito:是否在没有 @RunWith(MockitoJUnitRunner.class) 的情况下启用框架使用验证

转载 作者:行者123 更新时间:2023-11-30 07:57:39 34 4
gpt4 key购买 nike

我们正在使用 Testng 6.8.8 + Mockito 1.10.19,显然我们不能使用 MockitoJUnitRunner,但验证框架仍然有效!在这个thread我读到它不应该是这样的。有人可以解释吗?这是因为我们还有 @Before* 回调和 MockitoAnnotations.initMocks(this) 吗?

我的代码:

public class MealTransformerTest {

MealTransformer mealTransformer = new MealTransformer();

@Test(expectedExceptions = NotImplementedException.class)
public void shouldThrowException() throws NotImplementedException {
mealTransformer.transform(any(),
any(),
any(),
any());
}

}在此特定测试中没有失败,但当我运行该套件时,Mockito 会告诉我匹配器的不正确使用。

我也可以这样做:

public class MealTransformerTest {

MealTransformer mealTransformer = new MealTransformer();

//I don't need it in the tests. But I need at least 1 @Mock or @Spy to trigger framework validation
@Mock
private CloneUtils cloneUtils;

@BeforeMethod
void setUp() {
MockitoAnnotations.initMocks(this);
}


@Test(expectedExceptions = NotImplementedException.class)
public void shouldThrowException() throws NotImplementedException {
mealTransformer.transform(any(),
any(),
any(),
any());
}

@Test(expectedExceptions = NotImplementedException.class)
public void shouldThrowException123() throws NotImplementedException {
mealTransformer.transform(any(),
any(),
any(),
any());
}
}

我收到:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Misplaced argument matcher detected here:
....

不要误会我的意思,我真的很喜欢它的工作方式,但我很惊讶地看到它没有 @RunWith(MockitoJUnitRunner.class)

最佳答案

Matchers work via side-effects and static global state ,因此您可以将此调用分成几部分以查看发生了什么。

MockitoAnnotations.initMocks(this);
// in @Before [1]

mealTransformer.transform(any(), any(), any(), any());
// [6] [2] [3] [4] [5]

在 init [1] 之后,Java 看到四次调用 any [2-5] 和一次调用 transform [6]。然而,Mockito 只看到对 any 的四个调用;因为 mealTransformer 不是 mock,Mockito 看不到它的调用。如果您单独运行该测试,Mockito 将留下四个未使用的已记录匹配器。 JVM 将拆除测试框架,并且测试将通过——除非您在 @After 方法中调用了 validateMockitoUsage,这会捕捉到这种情况。

但是,当您有两个测试时,它们会像这样叠加:

MockitoAnnotations.initMocks(this);
// [1]
mealTransformer.transform(any(), any(), any(), any());
// [6] [2] [3] [4] [5]
// test passes! now the next test
MockitoAnnotations.initMocks(this);
// [7]
mealTransformer.transform(any(), any(), any(), any());
// [12] [8] [9] [10] [11]

这里,第 7 步发生在与第 1-6 步相同的 JVM 中的相同测试执行中,这意味着当堆栈上有 4 个未使用的匹配器时调用 initMocks。这永远不应该发生,所以 initMocks 捕获它的第一个机会来捕捉这个错误。一个症状是,如果 mised matcher exception 对应于失败的测试之外的 matcher: testB failing due to the misuse of a matcher in testA。通过在 @After 消息中使用 validateMockitoUsage,您会让适当的测试失败。

关于java - Mockito:是否在没有 @RunWith(MockitoJUnitRunner.class) 的情况下启用框架使用验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41045467/

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