我已经用@Test注释编写了一些JUnit测试.如果我的测试方法抛出一个已检查的异常,并且我想要将该消息与异常一起断言,那么有没有办法使用JUnit @Test注释?AFAIK,JUnit 4.7不提供此功能,但未来的版本是否提供此功能?我知道在.NET中你可以断言消息和异常类.寻找Java世界中的类似功能.
这就是我要的:
@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
Run Code Online (Sandbox Code Playgroud) 一些示例代码首先......
枚举:
public enum TestEnum {
YES,
NO
}
Run Code Online (Sandbox Code Playgroud)
一些代码:
public static boolean WorkTheEnum(TestEnum theEnum) {
switch (theEnum) {
case YES:
return true;
case NO:
return false;
default:
// throws an exception here
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
TestEnum是我从不同开发人员的不同代码导入的东西.所以它实际上可以改变.对于这种情况,我想要一个实际检查该非现有值的单元测试.但我根本不知道如何用Mockito和JUnit做到这一点.
这部分当然不起作用:
@Test(expected=Exception.class)
public void DoesNotExist_throwsException() throws Exception {
when(TestEnum.MAYBE).thenReturn(TestEnum.MAYBE);
WorkTheEnum(TestEnum.MAYBE);
}
Run Code Online (Sandbox Code Playgroud)
我发现了一个使用PowerMock的例子,但我无法与Mockito合作.
有任何想法吗?
我有一个switch语句来处理java enum foo,并使用spock编写一些groovy单元测试.我已经添加了一个测试,它验证当前是否处理了每种类型的foo而没有抛出异常.现在我想测试一个无法识别的foo类型会导致抛出异常.
要做到这一点,我将不得不模拟一个枚举,并已经看到这里概述的解决方案:模拟 Java枚举添加一个值来测试失败的情况
我也知道可以用powermock做,但我真的很喜欢spock,因为我发现它非常轻巧,所以我们正在寻找使用spock的解决方案.
我觉得这样的事可能有用:
def "An unexpected type of foo causes an exception to be thrown"() {
given:
Foo foo = Mock()
when:
subjectUnderTest.handleFoo foo
then:
thrown Exception
}
Run Code Online (Sandbox Code Playgroud)
但是,此操作失败,并显示以下错误消息:
org.spockframework.mock.CannotCreateMockException: Cannot create mock for class com.Foo because Java mocks cannot mock final classes. If the code under test is written in Groovy, use a Groovy mock.
我想知道是否有人知道使用spock的方法,因为我找不到任何文档的解决方案.
编辑在下面的一些评论之后,我觉得最好澄清我为什么要编写这些测试.
我在一个有很多开发人员的团队中工作,很可能他们中的一个会更新枚举.我希望测试失败,如果这恰好使开发人员意识到他们需要添加逻辑来处理新的枚举类型.为此,我编写了一个测试,迭代枚举可能具有的每个可能值,将其传递给方法并验证不会抛出异常.现在,如果用户添加了新的枚举,则此测试将失败,因为没有任何东西可以处理它,因此会(希望)抛出异常.
第二个测试(我正在努力编写的那个)是为了澄清默认逻辑的工作方式与我期望的一样,并且实际上异常会被抛出.在没有创建我永远不想使用的枚举值的情况下,我能想到这样做的唯一方法是模拟枚举,并测试如果不处理枚举值则抛出异常.
代码如下所示:
Enum Foo:
public enum Foo {
ONE, TWO;
}
Run Code Online (Sandbox Code Playgroud)
处理foo的方法:
private void handleFoo(Foo foo) …Run Code Online (Sandbox Code Playgroud)