首先-这是我的部分代码:
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();
}*/*
还有几个不同的选择,但我不知道怎么正确地称呼它。。
1条答案
按热度按时间de90aj5v1#
首先,只有当你有线程的时候,你才能有你想要的行为。
您可以有一个要发送的消息队列。一个线程将消息放入队列,另一个线程将从队列中获取消息。是生产者/消费者的经典问题。
可以有另一个代理从队列中删除消息,或者更简单地说,使用者可以检查另一个数据结构以了解是否丢弃或处理消息。
现在,在您的单元测试中,您可以用一个mock来替换消费者,该mock睡眠一定时间,以便给中断代理时间来执行操作。