gpt4 book ai didi

java - JUnit/Mockito 测试因奇怪的原因失败

转载 作者:行者123 更新时间:2023-12-01 16:33:07 32 4
gpt4 key购买 nike

我有一个非常简单的方法,我正在尝试对其进行单元测试:

public class MyAntTask extends org.apache.tools.ant.Task {
public void execute() {
fire();
}

public void fire() {
// Do stuff
}
}

我只是想编写一个单元测试来确认调用 execute() 总是调用 fire(),所以我写了这个:

@Test
public void executeCallsFire() {
//GIVEN
MyAntTask myTask = Mockito.mock(MyAntTask.class);

// Configure the mock to throw an exception if the fire() method
// is called.
Mockito.doThrow(new RuntimeException("fired")).when(myTask).fire();

// WHEN
try {
// Execute the execute() method.
myTask.execute();

// We should never get here; HOWEVER this is the fail() that's
// being executed by JUnit and causing the test to fail.
Assert.fail();
}
catch(Exception exc) {
// THEN
// The fire() method should have been called.
if(!exc.getMessage().equals("fired"))
Assert.fail();
}
}

我猜(我绝不是专家)Mockito 通常无法模拟返回 void 的方法,但这是一种解决方法。您基本上是说“用 Mock 包装我的对象,每当特定方法即将执行时,它总是返回特定的 RuntimeException”。因此,Mockito 只是看到它即将执行并抛出异常,而不是实际执行 fire() 。执行已验证?检查。

它没有通过,而是在调用 myTask.execute() 下面的第一个 Assert.fail() 处失败。

对于我的一生,我无法弄清楚为什么。这是 JUnit 为我提供的失败的巨大堆栈跟踪的前 10 行左右:

java.lang.AssertionError
at org.junit.Assert.fail(Assert.java:92)
at org.junit.Assert.fail(Assert.java:100)
at net.myproj.ant.tasks.MyAntTaskUnitTest.executeCallsFire(MyAntTaskUnitTest.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)

各位StackOverflow 的 Mockito 大师有什么想法吗?提前致谢!

最佳答案

因为 myTask 是一个模拟对象,所以根本不会调用真实的对象。要调用真实对象,请使用 spy 。

您可以使用 verify 来测试方法是否被调用,因此不需要异常。

public void executeCallsFire() {
MyAntTask myTask = Mockito.spy(new MyAntTask());

myTask.execute();

Mockito.verify(myTask).fire();
}

想要模拟您正在测试的对象似乎并不正确。通常最好设计测试,以便验证对单独对象的调用。

关于java - JUnit/Mockito 测试因奇怪的原因失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12443452/

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