当方法输入错误时,我的所有单元测试是否都会通过?

时间:2018-03-12 02:43:23

标签: java unit-testing junit tdd

我对测试驱动开发有些新意,并试图确定我的单元测试方法是否有问题 我有几个单元测试(让我们称之为A组)测试我的方法的返回是否符合预期 我还有一个单元测试“B”,其传递条件是当我的方法被赋予无效输入时抛出IllegalArgumentException
当方法被赋予无效输入时,组A中的单元测试失败,因为该方法需要有效输入才能正确返回 如果我捕获异常,单元测试“B”将失败,但如果我没有捕获异常,则组A中的测试将失败。
以这种方式使单元测试失败是否可以,或者我可以以某种方式修改代码以便所有测试都通过?
我做TDD都错了吗? 以下是我的代码概念,以便更清晰:

public class Example{
    public static String method(String inputString, int value){
        if(badInput){
            throw new IllegalArgumentException();
        }
        //do some things to inputString
        return modifiedInputString;
    }
}

public class ExampleTests{
    @Test
    public void methodReturnsIllegalArgumentExceptionForBadInput(){
        assertThrows(IllegalArgumentException.class, ()->{Example.method(badInput,badValue);})
    }

    //"Group A" tests only pass with valid input. Bad input causes IllegalArgumentException
    @Test
    public void methodReturnsExpectedType(){
        assertTrue(actual == expected);
    }

    @Test
    public void methodReturnsExpectedValue(){
        assertTrue(actual == expected);
    }

    @Test
    public void methodReturnsExpectedStringFormat(){
        assertTrue(actual == expected);
    }
}

1 个答案:

答案 0 :(得分:0)

正如您在评论中正确指出的那样,问题在于测试设置过于宽泛,测试过于隐含。

如果测试在业务级别上是自包含的,则更具可读性。常见的测试设置应侧重于设置技术细节,但所有业务设置应该在每个测试本身内。

您的案例示例(一个概念性示例,必须重新设计以匹配您的实施细节):

@Test
public void givenWhatever_whenDoingSomething_methodReturnsExpectedType(){
    given(someInputs);

    Type result = executeSut(); //rename executeSut to actual function under test name

    assertTrue(result == expected);
}

通过查看测试,读者可以知道正在测试的场景。常见的测试设置和帮助函数(如given)抽象出技术细节,因此读者在第一次检查时不会分心。如果他们感兴趣,细节总是可用 - 但通常不那么重要,可以隐藏。