Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito在具有null参数的void方法上进行了演示,没有抛出异常:我做错了什么?_Java_Mockito - Fatal编程技术网

Java Mockito在具有null参数的void方法上进行了演示,没有抛出异常:我做错了什么?

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

我不确定我是否发现了一个bug或者我只是做错了。我试图让一个模拟在调用一个方法时抛出一个异常(通常相对容易),除了该方法是
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,Read 通常是测试中的一个坏信号:如果它出现在测试方法的中间,通常该方法应该分成多个较小的测试,如果在<<代码> @ 或<代码> @后方法< /代码>,这意味着您的测试设置在测试之间污染。将模拟保存在实例字段中,而不是静态字段中,在

@Before
(JUnit)或
@BeforeMethod
(TestNG)方法中初始化,以确保它们在测试类中的每个测试之前都被完全覆盖。

不确定我没有测试您的代码,但“interfaceMock”看起来不是空的,因为它用@Mock注释,所以“做点什么方法不是用空参数调用的。您必须知道注释@Mock instance会关联从类派生的Mock。请确保您的
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));
}