2015-01-02 72 views
4

相結合我實現了一個從BlockJUnit4ClassRunner繼承的runner類A.class,以便我可以使用@RunWith(A.class)對測試進行註釋。同時,某人。否則使用RunWith(Parameterized.class)對測試進行註釋。很明顯,我們不能同時使用兩個@RunWith。如何將@RunWith與@RunWith(Parameterized.class)

如何解決這個問題?或者如何合併這兩個@RunWith?

回答

8

我相信這你想要做什麼:

package so.junit.runner; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 
import org.junit.runners.model.InitializationError; 
import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters; 
import org.junit.runners.parameterized.ParametersRunnerFactory; 
import org.junit.runners.parameterized.TestWithParameters; 

import java.util.Arrays; 

@RunWith(Parameterized.class) 
@Parameterized.UseParametersRunnerFactory(CustomParameterizedTest.RunnerFactory.class) 
public class CustomParameterizedTest { 

    @Parameterized.Parameters 
    public static Iterable<Integer> data() { 
    return Arrays.asList(new Integer[]{1, 2, 3}); 
    } 

    private int i; 

    public CustomParameterizedTest(int i) { 
    this.i = i; 
    } 

    @Test 
    public void test() { 
    System.out.println(i); 
    } 

    public static class RunnerFactory implements ParametersRunnerFactory { 
    @Override 
    public org.junit.runner.Runner createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError { 
     return new A(test); 
    } 
    } 

    public static class A extends BlockJUnit4ClassRunnerWithParameters { 
    private final Object[] parameters; 

    public A(TestWithParameters test) throws InitializationError { 
     super(test); 
     parameters = test.getParameters().toArray(new Object[test.getParameters().size()]); 
    } 

    @Override 
    public Object createTest() throws Exception { 
     return getTestClass().getOnlyConstructor().newInstance(parameters); 
    } 
    } 
} 

基礎上的Javadoc在JUnit參數化類,這也是他們希望你能創建一個支持參數化的自定義測試運行。

UPDATE

更新命名定製的運行A

+0

謝謝您的回答。但在你的代碼中,我無法弄清楚我的A.class在哪裏? – user389955

+0

'public static class Runner extends BlockJUnit4ClassRunnerWithParameters'與您的A.class相同,它可以是您的自定義亞軍實現(並支持參數化) – Alex

+0

我改正了這個例子。班級運動員必須讓你成爲一名跑步者。 @Alex希望這對你是好的。我不想創建一個新的答案。 –

相關問題