Java 如果变量值为null,则忽略JUnit测试
我有一个JUnit测试类,它运行15个测试。其中5个测试是可选的,因为我只希望在特定变量被参数初始化时运行它们。如果变量值为null,我想忽略这些测试。这可能吗?如果可能,如何实现 方法1: 你可以用。它具有执行条件测试的Java 如果变量值为null,则忽略JUnit测试,java,junit,junit4,Java,Junit,Junit4,我有一个JUnit测试类,它运行15个测试。其中5个测试是可选的,因为我只希望在特定变量被参数初始化时运行它们。如果变量值为null,我想忽略这些测试。这可能吗?如果可能,如何实现 方法1: 你可以用。它具有执行条件测试的RunIf注释,如: @Test @RunIf(DatabaseIsConnected.class) public void calculateTotalSalary() { //your code there } class DatabaseIsConnected
RunIf
注释,如:
@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
//your code there
}
class DatabaseIsConnected implements Checker {
public boolean satisify() {
return Database.connect() != null;
}
}
方法2
另一种方法是使用假设。您可以在@Before
方法或测试本身中执行,但不能在@After
方法中执行。如果在测试本身中执行此操作,则将运行@Before
方法。您还可以在@BeforeClass
中执行此操作,以防止类初始化。例如:
@Before
public void beforeMethod() {
org.junit.Assume.assumeTrue(someCondition());
}
方法3
我认为您的另一个选择可能是创建一个注释来表示测试需要满足您的自定义标准,然后使用您自己的反射扩展默认运行程序,并根据自定义标准做出决定。它可能看起来像这样:
public class CustomRunner extends BlockJUnit4ClassRunner {
public CTRunner(Class<?> klass) throws initializationError {
super(klass);
}
@Override
protected boolean isIgnored(FrameworkMethod child) {
if(shouldIgnore()) {
return true;
}
return super.isIgnored(child);
}
private boolean shouldIgnore(class) {
/* some custom criteria */
}
}
公共类CustomRunner扩展了BlockJUnit4ClassRunner{
公共CTRunner(类klass)引发初始化错误{
超级(klass);;
}
@凌驾
受保护的布尔值isIgnored(FrameworkMethod子级){
if(shouldIgnore()){
返回true;
}
返回super.isIgnored(子级);
}
私有布尔shouldingore(类){
/*一些自定义标准*/
}
}
方法1:
你可以用。它具有执行条件测试的RunIf
注释,如:
@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
//your code there
}
class DatabaseIsConnected implements Checker {
public boolean satisify() {
return Database.connect() != null;
}
}
方法2
另一种方法是使用假设。您可以在@Before
方法或测试本身中执行,但不能在@After
方法中执行。如果在测试本身中执行此操作,则将运行@Before
方法。您还可以在@BeforeClass
中执行此操作,以防止类初始化。例如:
@Before
public void beforeMethod() {
org.junit.Assume.assumeTrue(someCondition());
}
方法3
我认为您的另一个选择可能是创建一个注释来表示测试需要满足您的自定义标准,然后使用您自己的反射扩展默认运行程序,并根据自定义标准做出决定。它可能看起来像这样:
public class CustomRunner extends BlockJUnit4ClassRunner {
public CTRunner(Class<?> klass) throws initializationError {
super(klass);
}
@Override
protected boolean isIgnored(FrameworkMethod child) {
if(shouldIgnore()) {
return true;
}
return super.isIgnored(child);
}
private boolean shouldIgnore(class) {
/* some custom criteria */
}
}
公共类CustomRunner扩展了BlockJUnit4ClassRunner{
公共CTRunner(类klass)引发初始化错误{
超级(klass);;
}
@凌驾
受保护的布尔值isIgnored(FrameworkMethod子级){
if(shouldIgnore()){
返回true;
}
返回super.isIgnored(子级);
}
私有布尔shouldingore(类){
/*一些自定义标准*/
}
}
您可以使用JUnit4的功能
能够按照当前编写的代码运行测试、隐式假设和所有测试,或者编写暴露已知bug的测试,这是很好的。对于这些情况,JUnit现在包括表达“假设”的能力
例如:
@Before
public void setUp() {
org.junit.Assume.assumeTrue(yourCondition());
// ...
}
如果yourCondition()
未返回true,则将不会执行在之前运行的@测试。您可以使用JUnit4的功能
能够按照当前编写的代码运行测试、隐式假设和所有测试,或者编写暴露已知bug的测试,这是很好的。对于这些情况,JUnit现在包括表达“假设”的能力
例如:
@Before
public void setUp() {
org.junit.Assume.assumeTrue(yourCondition());
// ...
}
如果yourCondition()
没有返回true,那么在之前运行的@测试将不会执行。If(notInitialized){assert(true);return;}但是这样的测试有什么意义呢?If(notInitialized){assert(true);return;}但是这样的测试有什么意义呢?谢谢@Kaushal28。我选择了方法2。谢谢@Kaushal28。我采用了方法2。谢谢@glytching。在这种情况下,我们希望不管变量值是多少,都能运行大多数测试,所以我们选择了下面的方法2。谢谢@glytching。在这种情况下,我们希望运行大多数测试,而不考虑变量值,因此下面的方法2就是这样。