我开发了一些具有类似行为的类,它们都实现了相同的接口.我实现了一个工厂,它创建适当的对象并返回接口.我正在为工厂写一个单元测试.你得到的只是对象的接口.测试工厂工作正常的最佳方法是什么?
我想知道Java中的答案,但如果有一个跨越语言的解决方案,我想知道它.
答案中的第2号将像其他答案一样完成吗?如果是这样,我将标记另一个接受的答案并重新提出我的问题,以解决返回界面的工厂以及您不知道哪种类型的具体类实现了界面,以及您知道具体类是什么的情况用过的.
我已经使用Java 8几个月了,我已经开始使用Lambda表达式,这在某些情况下非常方便.但是,我常常遇到一些问题,要对使用Lambda的代码进行单元测试.
以下面的伪代码为例:
private Bar bar;
public void method(int foo){
bar.useLambda(baz -> baz.setFoo(foo));
}
Run Code Online (Sandbox Code Playgroud)
一种方法是仅仅验证条形码上的呼叫
verify(bar).useLambda(Matchers.<Consumer<Baz>>.any());
Run Code Online (Sandbox Code Playgroud)
但是,通过这样做,我不测试Lambda的代码.
另请注意,我无法使用方法替换Lambda并使用方法引用:
bar.useLambda(This::setFooOnBaz);
Run Code Online (Sandbox Code Playgroud)
因为我不会在那个方法上有foo.或者至少这是我的想法.
你以前遇到过这个问题吗?如何测试或重构我的代码以正确测试?
编辑
因为我编码的是单元测试,我不想实例化bar,而我将使用mock.所以我将无法验证baz.setFoo通话.
我有这个调用 Rest API 并将结果作为 Observable (Single) 返回的方法:
fun resetPassword(email: String): Single<ResetPassword> {
return Single.create { emitter ->
val subscription = mApiInterfacePanda.resetPassword(email)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe({ resetPasswordResponse ->
when(resetPasswordResponse.code()) {
200 -> {
resetPasswordResponse?.body()?.let { resetPassword ->
emitter.onSuccess(resetPassword)
}
}
else -> emitter.onError(Exception("Server Error"))
}
}, { throwable ->
emitter.onError(throwable)
})
mCompositeDisposable.add(subscription)
}
}
Run Code Online (Sandbox Code Playgroud)
单元测试:
@Test
fun resetPassword_200() {
val response = Response.success(200, sMockResetPasswordResponse)
Mockito.`when`(mApiInterfacePanda.resetPassword(Mockito.anyString()))
.thenReturn(Single.just(response))
mTokenRepository.resetPassword(MOCK_EMAIL)
val observer = mApiInterfacePanda.resetPassword(MOCK_EMAIL)
val testObserver = TestObserver.create<Response<ResetPassword>>()
observer.subscribe(testObserver)
testObserver.assertSubscribed()
testObserver.awaitCount(1)
testObserver.assertComplete()
testObserver.assertResult(response)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是只有这一行被覆盖,其他行不会运行,这对我的总测试覆盖率有很大影响: …