【发布时间】:2023-03-24 04:23:01
【问题描述】:
这似乎很容易,但我不知道该怎么做。我们有一个状态机,当触发转换时,事件会通过 EventManager 类发送。这是在一个新线程中启动的,因为我们不想在分发事件时阻塞当前线程。
假设我在模拟时忘记期待方法调用。测试现在应该失败。但这不是因为线程捕获了异常。我也不想传播期望,因为状态机在遇到异常时会停止。
public class TestStackoverflow {
@Test
public void test(){
EventManager eventManager = EasyMock.createStrictMock(EventManager.class);
EasyMock.replay(eventManager);
MyClass myClass = new MyClass();
myClass.executeStuff(eventManager);
EasyMock.verify(eventManager);
}
private class MyClass{
public void executeStuff(final EventManager eventManager){
new Thread() {
public void run() {
eventManager.sendEvent();
}
}.start();
}
}
interface EventManager{
public void sendEvent();
}
}
eventManager.sendEvent() 抛出 java.lang.AssertionError,但单元测试没有失败。
Exception in thread "Thread-0" java.lang.AssertionError:
Unexpected method call EventManager.sendEvent():
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:94)
at org.easymock.internal.ClassProxyFactory$MockMethodInterceptor.intercept(ClassProxyFactory.java:97)
at at.ac.TestStackoverflow$EventManager$$EnhancerByCGLIB$$cbb0f0e1.sendEvent(<generated>)
at at.ac.TestStackoverflow$MyClass$1.run(TestStackoverflow.java:27)
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.58 sec
我该如何测试这种情况?
【问题讨论】:
-
线程没有捕捉到异常。如果 sendEvent() 抛出一个,线程会像你的主线程一样“中断”,如果一个未处理的异常会被抛出。声明你的 sendEvent() 抛出异常。 public void sendEvent() 抛出异常;这将迫使你在线程的 run() 中尝试捕捉它,你必须在那里处理它。如果测试失败,则强制它在捕获中失败。我帮你了吗?我不确定我是否理解您的问题
-
是的,但这仅适用于示例。实际上,被测试的类不在单元测试之内,我不会在单元测试之外使用 Assert.fail()。
-
好吧,我对单元测试了解不多,我是新手。但据我所知,你有两种方法。 a)通过使用 Assert.fail() 强制它失败 b)更改一个标志,如布尔值或其他东西,并在运行代码后对其进行测试。示例布尔失败 = 假。在您的代码末尾执行 if(failed)*强制它失败/产生错误/无论如何使其失败*
标签: java multithreading testng easymock