我创建了一个测试套件,使用@ClassRule打开连接等。现在我可以运行所有测试,连接只打开一次。
但是现在,当我尝试运行单个测试时,我收到错误,因为没有打开连接。我该如何解决这个问题?
代码说明了我正在尝试做的事情:
@RunWith(Suite.class)
@SuiteClasses({MyTestCase.class})
public class MyTestSuite {
public static String connection = null;
@ClassRule
public static ExternalResource resource = new ExternalResource() {
@Override
protected void before() throws Throwable {
connection = "connection initialized";
};
@Override
protected void after() {
connection = null;
};
};
}
public class MyTestCase {
@Test
public void test() {
Assert.notNull(MyTestSuite.connection);
}
}
编辑:@Jens Schauder建议之后的当前解决方案。工作,但看起来很难看。还有更好的方法吗?
public class ConnectionRule extends ExternalResource {
private static ConnectionRule singleton = null;
private static int counter = 0;
private String connection = null;
public static ConnectionRule newInstance(){
if(singleton == null) {
singleton = new ConnectionRule();
}
return singleton;
}
@Override
protected void before() throws Throwable {
if(counter == 0){
System.out.println("init start");
connection = "connection initialized";
}
counter++;
};
@Override
protected void after() {
counter--;
if(counter == 0){
System.out.println("init end");
connection = null;
}
};
public String getConnection() {
return connection;
}
}
@RunWith(Suite.class)
@SuiteClasses({MyTestCase.class, MyTestCase2.class})
public class MyTestSuite {
@ClassRule
public static ConnectionRule rule = ConnectionRule.newInstance();
}
public class MyTestCase {
@ClassRule
public static ConnectionRule rule = MyTestSuite.rule;
@Test
public void test() {
Assert.notNull(rule.getConnection());
}
}
MyTestCase2完全相同。
答案 0 :(得分:1)
将规则放在测试上,而不是TestSuite。
您可以扩展规则,以便:
如果连接已经存在,则不会重新创建连接
保留对连接的引用,因此以后的测试可以重用连接。
对测试之间保持的连接的引用可能是soft or weak one。