在我的测试用例中,它必须使用多个断言。问题是如果一个断言失败则执行停止。我希望测试用例在遇到断言失败后继续执行,并且在执行后显示所有断言失败。
例如:
assertTrue("string on failure",condition1);
assertTrue("string on failure",condition2);
assertTrue("string on failure",condition3);
assertTrue("string on failure",condition4);
assertTrue("string on failure",condition5);
在这个示例中,我希望如果assert对condition2失败,那么它应该继续执行并在完成执行后显示所有失败。
答案 0 :(得分:4)
对于纯粹的JUnit解决方案,请使用 ErrorCollector TestRule来处理您的声明。
ErrorCollector 规则在测试执行完成之前不会报告。
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.event.MouseInputAdapter;
public class Test extends JFrame {
private JLabel label;
private int click_count = 0;
public Test(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label = new JLabel("click count " + click_count);
label.setPreferredSize(new Dimension(200,100));
label.addMouseListener(new MouseInputAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
labelClicked();
}
});
add(label);
validate();
pack();
}
/**
*
*/
private void labelClicked() {
click_count++;
updateLabel();
repaint();
}
/**
*
*/
private void updateLabel() {
label.setText("click count " + click_count);
}
public static void main(String[]arghs){
Test frame = new Test();
frame.setVisible(true);
}
}
在您的具体示例中:
import org.hamcrest.core.IsEqual;
import org.hamcrest.core.IsNull;
import org.hamcrest.text.IsEmptyString;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
public class ErrorCollectorTest {
@Rule
public ErrorCollector collector = new ErrorCollector();
@Test
public void testMultiAssertFailure() {
collector.checkThat(true, IsEqual.equalTo(false));
collector.checkThat("notEmpty", IsEmptyString.isEmptyString());
collector.checkThat(new Object(), IsNull.nullValue());
collector.checkThat(null, IsNull.notNullValue());
try {
throw new RuntimeException("Exception");
} catch (Exception ex){
collector.addError(ex);
}
}
}
会变成
assertTrue("string on failure",condition1);
assertTrue("string on failure",condition2);
assertTrue("string on failure",condition3);
assertTrue("string on failure",condition4);
assertTrue("string on failure",condition5);
答案 1 :(得分:1)
您要寻找的功能称为Soft Assertion,请尝试assertj
java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.google.android.youtube.api.service.START }
at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1209)
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1308)
at android.app.ContextImpl.bindService(ContextImpl.java:1286)
软断言将允许执行到下一步而不会在失败时抛出异常。在最后 SoftAssertions soft = new SoftAssertions();
soft.assertThat(<things>).isEqualTo(<other_thing>);
soft.assertAll();
方法中,将所有收集的错误抛出一次。
答案 2 :(得分:0)
这里的另一个选择是许多人说你应该总是做的最佳实践:只在每个测试用例中加上一个断言。
通过这样做,每个潜在的失败都以某种方式彼此隔离;并且你直接得到你正在寻找的东西 - 因为JUnit将准确地告诉你,哪些测试失败了,哪些测试失败了。无需介绍其他概念。
(你知道,即使像ErrorCollector或SoftAssertions这样的其他概念非常容易和直接使用 - 它们会给你的代码增加一些复杂性;使它更难阅读和理解)