Java Mockito在具有null参数的void方法上进行了演示,没有抛出异常:我做错了什么?
我不确定我是否发现了一个bug或者我只是做错了。我试图让一个模拟在调用一个方法时抛出一个异常(通常相对容易),除了该方法是Java Mockito在具有null参数的void方法上进行了演示,没有抛出异常:我做错了什么?,java,mockito,Java,Mockito,我不确定我是否发现了一个bug或者我只是做错了。我试图让一个模拟在调用一个方法时抛出一个异常(通常相对容易),除了该方法是void返回类型,并且要传入的对象(抛出错误的原因)是null。这可以通过isNull()键入以进行编译,但仍然不会抛出错误 package some.example; import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.doThrow; import static org
void
返回类型,并且要传入的对象(抛出错误的原因)是null
。这可以通过isNull()
键入以进行编译,但仍然不会抛出错误
package some.example;
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
import javax.jms.Message;
import javax.jms.MessageListener;
import org.mockito.Mock;
import org.springframework.jms.listener.AbstractMessageListenerContainer;
import org.springframework.jms.listener.SessionAwareMessageListener;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class TestClass {
@Mock
private AbstractMessageListenerContainer messageContainer;
@BeforeClass
public void setUpMocks() {
initMocks(this);
doThrow(new IllegalArgumentException()).when(messageContainer).setupMessageListener(
isNull(MessageListener.class));
doThrow(new IllegalArgumentException()).when(messageContainer).setupMessageListener(
isNull(SessionAwareMessageListener.class));
}
@AfterMethod
public void resetMocks() {
reset(messageContainer);
}
@Test(expectedExceptions = { IllegalArgumentException.class })
public void testSetUpQueueConsumerWithNullMessageListener() throws Exception {
final MessageListener messageListener = null;
try (final QueueConsumer consumer = new QueueConsumer(messageContainer, messageListener)) {
} finally {
verify(messageContainer).setupMessageListener(messageListener);
}
}
@Test(expectedExceptions = { IllegalArgumentException.class })
public void testSetUpQueueConsumerWithNullSessionAwareMessageListener() throws Exception {
final SessionAwareMessageListener<Message> messageListener = null;
try (final QueueConsumer consumer = new QueueConsumer(messageContainer, messageListener)) {
} finally {
verify(messageContainer).setupMessageListener(messageListener);
}
}
public class QueueConsumer implements AutoCloseable {
private final AbstractMessageListenerContainer messageContainer;
QueueConsumer(final AbstractMessageListenerContainer messageContainer,
final SessionAwareMessageListener<? extends Message> messageListener) {
this(messageContainer);
this.messageContainer.setupMessageListener(messageListener);
}
QueueConsumer(final AbstractMessageListenerContainer messageContainer, final MessageListener messageListener) {
this(messageContainer);
this.messageContainer.setupMessageListener(messageListener);
}
private QueueConsumer(final AbstractMessageListenerContainer messageContainer) {
if (messageContainer == null) {
throw new IllegalArgumentException("MessageListenerContainer cannot be null");
}
this.messageContainer = messageContainer;
}
public void stop() {
messageContainer.stop();
}
@Override
public void close() throws Exception {
stop();
}
}
}
如注释和编辑中所述:请注意,该方法完全重置模拟,包括存根和交互(后者用于验证)
AS,
(JUnit)或@Before
(TestNG)方法中初始化,以确保它们在测试类中的每个测试之前都被完全覆盖。@BeforeMethod
initMocks
方法是在@之前注释的,而不是在@之前注释的。还有,SimpleExample
这里是一个类吗?它有任何最终方法吗?@Joel你说得对。正如你所说,我修正了这个例子,它是有效的。因此,我精简了我正在使用的实际代码,它也可以工作,无需一系列其他函数调用和一些验证。因此,在设置中我缺少的某些地方一定有一些交互作用。@JeffBowman您暗示了正确的解决方案。我编辑了这篇文章以反映它。我相信您正在考虑使用JUnit的Before
,其中TestNG使用Before方法。当我遇到这样的小问题时,我间歇性地错误地进行模拟设置,忘记了正确的方法。谢谢你的帮助,乔尔也是。说得好。我意识到,一旦我解决了这个问题,就重写了两个测试来使用本地模拟方法。
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.21</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.0.8-beta</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${org.springframework.version}</version>
</dependency>
@BeforeClass
public void setUpMocks() {
initMocks(this);
}
@BeforeMethod
public void setUpThrows() {
doThrow(new IllegalArgumentException()).when(messageContainer).setupMessageListener(
isNull(MessageListener.class));
doThrow(new IllegalArgumentException()).when(messageContainer).setupMessageListener(
isNull(SessionAwareMessageListener.class));
}