gpt4 book ai didi

java - 在 1 个测试方法中使用 junit @Rule、expectMessage()、匹配器来处理多个异常

转载 作者:行者123 更新时间:2023-12-01 10:05:57 29 4
gpt4 key购买 nike

在我的 Android 项目中,我想使用相同的 @Test 测试一个类,该类可以使用不同的消息多次抛出相同的异常。我希望我的测试对于给定的消息列表能够通过,而对于其他消息列表则失败。

对 Junit 进行了一些研究,我尝试使用 @Rule 来实现这一点, expectMessage()Hamcrest 匹配器

我的实现目前基于描述的“自定义匹配器”here .

@RunWith(AndroidJUnit4.class)
public class TestException extends ApplicationTestCase {

@Rule public ExpectedException thrown= ExpectedException.none();

public TestException(){
super(AplicatyApplication.class);
}

@Test
public void testException() throws Exception {
thrown.expect(IndexOutOfBoundsException.class);
thrown.expectMessage(new MatchesPattern("*"));
Dummy.exec(0);
// do more stuff here ...
Dummy.exec(1);
// ...
Dummy.exec(2);
// ...
Dummy.exec(3); // I want my test to fail here
// ...
}

class MatchesPattern extends TypeSafeMatcher<String> {
private String pattern;

public MatchesPattern(String pattern) {
this.pattern = pattern;
}

@Override
protected boolean matchesSafely(String item) {
return item.matches(pattern)
&&
item.startsWith("My message")
&& (
item.endsWith("1")
||
item.endsWith("2")
);
}

@Override
public void describeTo(Description description) {
description.appendText("matches pattern ").appendValue(pattern);
}

@Override
protected void describeMismatchSafely(String item, Description mismatchDescription) {
mismatchDescription.appendText("does not match");
}
}

static class Dummy {
static void exec(int i){
if(i == 0)
return;
if(i == 1)
throw new IndexOutOfBoundsException("My message1");
if(i == 2)
throw new IndexOutOfBoundsException("My message2");
if(i == 3)
throw new IndexOutOfBoundsException("My message3");
}
}
}

运行此测试,我可以看到匹配器仅被调用一次,执行 Dummy.exec(1); .

matchesSafely(String item)返回true测试以通过状态结束。根据我对@Rule的理解,这一切似乎都可以。我在等待一个异常(exception):我明白了;我正在等待一条给定的消息:我收到了。

一旦抛出第一个异常,我就找不到继续执行测试的方法。

我的问题是:

  • 是否可以使用@Rule来检查一个测试方法中抛出的多个异常,或者我是否必须使用典型的try/catch来测试每个catch block 中的异常消息?
  • 是否有另一种/更优雅的方法来测试此类问题。

最佳答案

我建议将测试方法拆分为多个测试,每个测试对应一个需求。

@Test
public void testException_1() throws Exception {
thrown.expect(IndexOutOfBoundsException.class);
thrown.expectMessage("My message1");

Dummy.exec(1);
}

如果它需要在一个测试方法中,我会使用 try-catch 和 ErrorCollector 来构建它。 .

@Test
public void testException_1() throws Exception {
try {
Dummy.exec(1);
fail();
} catch (IndexOutOfBoundsException e) {
errorCollector.checkThat(e.getMessage(), is("My message1"));
}

try {
Dummy.exec(2);
...
} ...
}

我会尽量避免构建自定义匹配器。

关于java - 在 1 个测试方法中使用 junit @Rule、expectMessage()、匹配器来处理多个异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36476884/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com