如何使用Theories和Parameterized单元测试跑步者?

时间:2016-10-08 12:35:41

标签: java unit-testing junit

我需要在一个单元测试类中使用多个设置。此外,我需要使用许多案例来测试方法。对于我来说,将参数化理论运行器组合在一起是最自然的,例如:

@RunWith(ParameterizedTheories.class)
public class Tests {

    Setup o;

    @Parameters(name = "{index}: {0}")
    public static Iterable<Object> data() {
        return asList(new Object[][]{
                        asArray("First", Tests::setup1),
                        asArray("Second",Tests::setup2),
                     });

    public Tests(String name, Setuper setuper) {
         Setup o = setuper.setup();
    }

    @Theory
    public void AddSevenTest(
          @TestedOn(ints = {0, 5, 10})int x){

        o.implementation.addSevenAnd(x);
        verify(o.storageMock).save(x + 7);
    }

    static Setup setup1(){
         // ...
    }

    static Setup setup2(){
         // ...
    }

    interface Setuper {
        Setup setup();
    }

    static class Setup {
        IStorage storageMock;
        ITesting implementation;
    }
}

我没有找到任何用途。有什么能帮助我的吗?什么?

1 个答案:

答案 0 :(得分:0)

通过仅使用现有的JUnit工具(类),但通过从JUnit Runner-s的层次结构中扩展其中一个类,无法实现。

此外,这个问题可以通过其他简单的以下方式解决:

@RunWith(Theories.class)
public class BaseTests {

    protected Setup o;

    @Before
    public void setUp();

    @Theory
    public void AddSevenTest(
         @TestedOn(ints = {0, 5, 10})int x){

         o.implementation.addSevenAnd(x);
         verify(o.storageMock).save(x + 7);
    }

    static class Setup {
         IStorage storageMock;
         ITesting implementation;
    }
}

public class Tests1 extends BaseTests {
    @Ovveride @Before
    public void setUp() {
         // ...
    }
}

public class Tests2 extends BaseTests {
    @Ovveride @Before
    public void setUp() {
         // ...
    }
}

@RunWith(Suite.class)
@Suite.SuiteClasses({
    Tests1.class,
    Tests2.class
})

public class Tests {   
}