在JUnit中订购

时间:2015-10-21 05:15:59

标签: java unit-testing junit

我从“How to run test methods in specific order in JUnit4?”中读到......

  

使测试顺序依赖是作者不想推广的做法。测试应该是独立的,它们不应该耦合,违反这将使事情更难维护

在这种情况下,我应该如何在首次设置时测试获取某个数据的方法?

例如,我有String getStringAttribute(String key)void setStringAttribute(String key, String attr)。我该如何测试它们?为了正确测试getStringAttribute(),我可能需要测试一些尚未设置的内容并测试已设置的内容。

我应该在setStringAttribute()中使用testGetStringAttribute()吗?

5 个答案:

答案 0 :(得分:0)

setStringAttribute()方法中致电setUp。这是使用@Before进行分类的方法。保证在调用测试方法之前调用它。

答案 1 :(得分:0)

理想情况下,测试用例应始终在其设置方法中设置所需的所有值(即@Before方法),然后清除其@After方法中的所有值。

因此,对于您的情况,可能的方法是创建类的对象并在@Before类中调用其set方法,然后在测试用例中调用get方法来测试它。然后在@After课程中,清除所有对象。

例如:

ClassToTest classToTest;
String expectedValue = "somevalue";

@Before
public void setUp() {
    this.classToTest = new ClassToTest();
    this.classToTest.setStringAttribute("somekey", "somevalue");
}

@After
public void tearDown() {
    this.classToTest = null;
}

@Test
public void testValue() {
    assertEquals(this.expectedValue,this.classToTest.getStringAttribute("somekey"));
}

为了测试set方法,一种方法是使用反射: 例如:

Field field = ClassToTest.class.getDeclaredField("stringAttribute");
field.setAccessible(true);
field.get(classToTest);

答案 2 :(得分:0)

首先,我会说测试setter和getter感觉有点奇怪。至少从我的角度来看,这些方法不应包含任何业务逻辑。

如前所述,调用 setUp 或任何其他使用 @Before 注释的方法都是不错的选择。如果此设置干扰您的其他测试,只需创建一个新的测试文件并在其中创建自己的 setUp 方法。

但是,我会 建议甚至不使用生产方法来设置您的系统进行测试 。如果您决定更改 setStginAttribute 方法,则可能会导致其他一些问题。因此,最好的选择是创建原始数据,然后根据它测试您的系统。这意味着测试将完全独立于系统,如果您决定更改其他方法而不是您测试的方法,则不会失败。

答案 3 :(得分:0)

通常不需要测试getter和setter,因为它们通常只返回一个属性值。但是,如果您有兴趣检查某些内容是否被调用以及您可以使用Mockito之类的测试框架以何种顺序执行此操作,特别是其InOrder验证。这将使您更加确信您的代码实际上正在执行在给定测试中应该执行的操作。

答案 4 :(得分:-1)

您可能希望将两种方法分开,然后为它们编写测试用例。例如,这是我最近在JUNIT中测试的两种方法

@Test
    public void testCountFactors ()
    {
        assertEquals(1, Loops.countFactors(1));
        assertEquals(4, Loops.countFactors(6));
        assertEquals(2, Loops.countFactors(11));
        assertEquals(8, Loops.countFactors(30));
    }

    @Test
    public void testCountWhitespace ()
    {
        assertEquals(0, Loops.countWhitespace(""));
        assertEquals(0, Loops.countWhitespace("xyz"));
        assertEquals(10,
                Loops.countWhitespace("one two  three   four    "));
        assertEquals(8,
                Loops.countWhitespace("one\ttwo\n\nthree   four\n\t"));
    }

assertEquals给出了一个期望的值和'循环'。调用类和方法以及指定的输入。简而言之,通过分离这些方法而不是试图在一个巨大的(意大利面条代码)测试案例中同时测试它们,这简化了两种方法的测试。