gpt4 book ai didi

java - 如何创建自定义 "ExpectedException"junit 规则?

转载 作者:行者123 更新时间:2023-11-30 05:47:21 25 4
gpt4 key购买 nike

我需要创建一个规则来检查自定义消息的异常。下面是我的尝试,但这并不完全正确,因为我只是使用标准“ExpectedException”中的方法。怎样做才是正确的?

public class CustomExpectedExceptionRule implements TestRule {
private final ExpectedException delegate = ExpectedException.none();

public static CustomExpectedExceptionRule none() {
return new CustomExpectedExceptionRule();
}

private CustomExpectedExceptionRule() {
}

public void expect(Class<? extends Throwable> type) {
delegate.expect(type);
}

public void expectMessage(String message) {
delegate.expectMessage(message);
}

@Override
public Statement apply(Statement base, Description description) {
return delegate.apply(base, description);
}

现在我正在尝试类似的事情:

 private final ExpectedException expectedException = ExpectedException.none();
private Object exception;
private String expectedMessage;

@Override
public Statement apply(Statement base, Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
expectedException.expect((Class<? extends Throwable>) exception);
expectedException.expectMessage(expectedMessage);
base.evaluate();
}
};
}

public void expectedMessage(String expectedMessage) {
this.expectedMessage = expectedMessage;
}

public void expectedException(Object exception) {
this.exception = exception;
}

但是,尽管此处的所有字段都通过了,但在抛出异常未通过的情况下,此测试不起作用。如何以正确的形式重新制作它?

最佳答案

据我了解要求,在您的测试中您需要:

public class MyTest {
@Rule
ExpectedException expExc = ExpectedException.none();

@Test
public void throwsNothing() {
// "normal tests" not affected.
}

@Test
public void throwsExceptionWithSpecificTypeAndMessage() {
expExc.expect(MyCustomException.class);
expExc.expectMessage("substring, that passes test");// other matchers possible
// do something that (is expected to) raise(s)
// MyCustomException("substring, that passes test").
}
}

..其中MyCustomException.class是一个自定义异常类(继承层次结构中尽可能最低的类,您希望“通过”它),以及通过测试的子字符串 您想要“传递”的消息(部分)。

引入自定义TestRule可以为您节省1行/测试。在这个简单的情况下,我建议您不要实现接口(interface),而是扩展 ExternalResource (, see here )):

class CustomExpectedException extends ExternalResource /*implements (!) TestRule*/ {

private ExpectedException expExc = ExpectedException.none();

/* Parameterize the message and also the class, if it fits your needs,
* alternatively && additionally implement defaults/constants/more methods.*/
public void myExpect(String substr) {
expExc.expect(MyCustomException.class);
expExc.expectMessage(substr);// other matchers possible
}
}

...然后像这样使用它:

public class MyTest {
@Rule
CustomExpectedException expExc = new CustomExpectedException();
...
@Test
public void throwsExceptionWithSpecificTypeAndMessage() {
expExc.myExpect("substring, that passes test");
// do something...
}
}
<小时/>

无规则方法(, see here ) :

public class MyTest {
@Test
public void throwsExceptionWithSpecificTypeAndMessage() {
try { // !
// do something ...
// after that, fail the test:
org.junit.Assert.fail("expected exception!");
} catch (Exception exc) { // ! here i would recommend "the highest possible Exception" (in inheritance hierarchy) ...even better <code>Throwable</code>.
// this code can be moved to a (static) util method:
if (exc instanceof MyCustomException) {
// make assertions on ((MyCustomException) exc).getMessage();
} else {
org.junit.Assert.fail("UNexpected exception!");
// or rethrow:
// throw exc;
}
}
}
}

关于java - 如何创建自定义 "ExpectedException"junit 规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54617291/

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