Lyu*_*riv 10 java junit testng unit-testing
我经常使用接受回调的方法,回调似乎有点难以测试.让我们考虑以下场景,如果有一个方法接受单个方法的回调(为简单起见,我假设测试方法是同步的),可以编写以下样板文件以确保调用回调方法:
@Test
public void testMethod() {
final boolean[] passed = {false};
method(new Callback() {
@Override
public void handle(boolean isSuccessful) {
passed[0] = isSuccessful;
}
});
assertTrue(passed[0]);
}
Run Code Online (Sandbox Code Playgroud)
它看起来像一个代理人.我想知道:有没有更优雅的方法来测试这样的代码,使上面的代码看起来更像下面的伪代码?
@Test
public void testMethod() {
// nothing explicit here, implicit boolean state provided by a test-runner
method(new Callback() {
@Override
public void handle(boolean isSuccessful) {
if ( isSuccessful ) {
pass(); // not sure how it should look like:
// * an inherited method that sets the state to "true"
// * or an object with the pass method
// * whatever
// but doesn't exit testMethod(), just sets the state
}
}
});
// nothing explicit here too:
// test runner might check if the state is changed to true
// otherwise an AssertionError might be thrown at the end of the method implicitly
}
Run Code Online (Sandbox Code Playgroud)
有点清洁.是否可以在JUnit,TestNG或任何其他测试框架中使用?谢谢!
UPDATE
对不起,我似乎问过一个模糊的问题,这个问题并没有真正符合我的要求.我基本上是指任何代码(不一定是回调),如果满足某些条件只是为了将结果状态设置为true,则可以调用它.简单来说,我只是想摆脱初始boolean[] passed和最后的assertTrue(passed[0])假设它们分别是某种序言和结语,并假设初始状态设置为false所以pass()应该调用以将状态设置为true.无论怎样的passed[0]设定为true,无论从哪里.但不幸的是,我使用回调的上下文问了这个问题,但这只是一个选项,而不是一个要求.因此,问题的标题并没有反映我真正想要问的内容,但在更新之前,已经发布了一些答案.
fge*_*fge 15
这通常是模拟框架可以为您做的事情.
以Mockito为例:
// imports ommited for brevity
@Test
public void callbackIsCalled()
{
final CallBack callBack = mock(CallBack.class);
method(callBack);
verify(callBack, only()).handle(any());
}
Run Code Online (Sandbox Code Playgroud)
当然,这是验证模式(only())和值匹配器(any())的示例.你可以做更多......
(存在其他模拟框架,但我个人认为Mockito最容易使用,除了是最强大的之一)
鉴于这是你可能在几个地方需要的东西,我只想创建一个用于测试的命名类:
public class FakeCallback implements Callback {
private boolean wasSuccessful;
private boolean handleCalled;
@Override public void handle(boolean isSuccessful) {
this.wasSuccessful = isSuccessful;
handleCalled = true;
}
// Getters for fields above
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用类似的东西:
// Arrange...
FakeCallback callback = new FakeCallback();
// Act...
method(callback);
// Assert
assertTrue(callback.wasHandleCalled());
assertTrue(callback.wasSuccessful());
Run Code Online (Sandbox Code Playgroud)
你绝对可以使用一个模拟框架,但我个人发现创建一个假实现通常比重复设置模拟更简单.两种方式都可行.
| 归档时间: |
|
| 查看次数: |
9338 次 |
| 最近记录: |