簡體   English   中英

在 Junit 或 Groovy/Spock 測試中測試匿名 class

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM