java—在if语句中调用布尔超时函数,使其不发送电子邮件

fxnxkyjh  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(212)

首先-这是我的部分代码:

public void run() {

            try {

            _conn = new SmtpConnection(this, _socket);
            _state = new SmtpState(_workspace);
            _quitting = false;

            sendGreetings();

                while (!_quitting)
                handleCommand();

        } catch (SocketTimeoutException ste) {
            _conn.send("421 Service shutting down and closing transmission channel");

        } catch (Exception e) {
            // Closing socket on blocked read

            if (!_quitting) {
                log.error("Unexpected error handling connection, quitting=", e);
                throw new IllegalStateException(e);
            }
        } finally {
            if (null != _state) {
                _state.clearMessage();
            }
        }

    }

我在另一个类中还有一个函数,叫做timeoutonemail

public boolean timeoutOnNextEmail()
{

    boolean timeout = true;
    return timeout;
}

我有一个unittest,它应该尝试发送电子邮件,但是当我调用timeoutfuntion时,测试应该通过-所以它不应该发送电子邮件

/*    @Test(expected = MailException.class)
public void sendEmailFail() throws MailException {

    greenMail.timeoutOnNextEmail();

    try {
        app.sendMail("to", "from", "subject", "body");
    } catch (final MailException e) {
        throw new MailException(e.toString());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    assertEquals(0, greenMail.getReceivedMessagesForDomain("to").length);
}*/

我如何告诉我的run函数,如果我在unittest中调用timeoutfuntion,那么它应该停止这样做,让我的线程休眠。。我试过类似的方法


* /*                    if(timeout && !_quitting){

                greenMail.timeoutOnNextEmail();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            else
            {
                handleCommand();
            }*/*

还有几个不同的选择,但我不知道怎么正确地称呼它。。

de90aj5v

de90aj5v1#

首先,只有当你有线程的时候,你才能有你想要的行为。
您可以有一个要发送的消息队列。一个线程将消息放入队列,另一个线程将从队列中获取消息。是生产者/消费者的经典问题。
可以有另一个代理从队列中删除消息,或者更简单地说,使用者可以检查另一个数据结构以了解是否丢弃或处理消息。
现在,在您的单元测试中,您可以用一个mock来替换消费者,该mock睡眠一定时间,以便给中断代理时间来执行操作。

相关问题