[英]Test anonymous class in Junit or Groovy/Spock test
我正在嘗試在 Groovy/Spock 中編寫單元測試,並且必須測試以下代碼。
public class ClassA {
@Inject
private ClassB classB;
@Inject
private ClassC classC;
@Inject
private ClassD classD;
public void update(final int a, final Map<String, Object> b) {
classB.executeCommand(classC.callToMethodInClassC(), new InterfaceE<Void>() {
@Override
public Void execute() {
classD.update(a, b);
return null;
}
});
}
}
現在,當我編寫測試代碼時,我無法訪問classD.update(a, b);
線。 我知道如何為 ClassB、ClassC、ClassD 注入模擬/真實 object,但無法達到該聲明。 請幫忙。
注意: ClassA.update()
和ClassD.update()
之間沒有任何關系,只是它們的簽名匹配。
讓你的 classB 像這樣模擬:
Mock(ClassB) {
executeCommand(_, _) >> { c, e -> e.execute() }
}
即為ClassB的executeCommand
方法提供一個mock實現,實際上調用interfaceE的execute
方法。
編輯:完整的工作示例:
import spock.lang.Specification
class TestMeSpec extends Specification {
def "my test"() {
def b = Mock( ClassB ) {
executeCommand( _, _ ) >> { c, e -> e.execute() }
}
def c = Mock( ClassC )
def d = Mock( ClassD )
def a = new ClassA( classB: b, classC: c, classD: d )
when:
a.update( 0, [ : ] )
then:
1 * d.update( 0, [ : ] )
}
}
class ClassA {
ClassB classB
ClassC classC
ClassD classD
void update( final int a, final Map<String, Object> b ) {
classB.executeCommand( classC.callToMethodInClassC(), new InterfaceE<Void>() {
@Override
Void execute() {
classD.update( a, b )
}
} )
}
}
class ClassB {
void executeCommand( c, InterfaceE e ) {
println "REAL CLASS B executCommand() METHOD RUNNING"
}
}
class ClassC {
def callToMethodInClassC() {}
}
class ClassD {
void update( a, b ) {
println "REAL CLASS D update() method called with $a and $b"
}
}
interface InterfaceE<T> {
T execute()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.