[英]How can I reflectively call a method on a Scala object from Java?
[英]How can I reflectively access the test method to run after a call to @Before setup()?
我们有很多通过junit运行的硒测试,并且它们都有一些实际测试之前需要运行的步骤。 为此,我们有一个父TestCase类,其中包含一些@Before和@After方法。
现在,由于我们网站的一项新功能,我想参数化此设置的一部分,我想创建一个新的批注以进行一些测试,以向setup()方法表明设置略有不同,同时允许其他人使用默认值。 因此,是否有可能以反射方式访问即将在@Before方法中运行的测试方法?
例如。
class SomeTest extends MyTestCase {
@Test
@Flavour(Red.class)
public void testRedFlavouredHomepage() {
testHomepage();
}
@Test
public void testBlueFlavouredHomepage() { // assuming Blue is my default flavour
testHomepage();
}
public void testHomepage() {
// test some stuff
}
}
我宁愿建议对这两种方法使用不同的测试类。
class MyTestCase {
@Before
public void setUp() {
/* Default setup */
}
public void testHomepage() {
// test some stuff
}
}
class MyRedTestCase extends MyTestCase {
@Before
public void setUp() {
super.setUp();
/* Red setup */
}
}
然后,您可以将测试放入分别从MyTestCase和MyRedTestCase扩展的2个不同的类中。
class BlueTest extends MyTestCase {
@Test
public void testBlueFlavouredHomepage() { // assuming Blue is my default flavour
testHomepage();
}
}
class RedTest extends MyRedTestCase {
@Test
public void testRedFlavouredHomepage() {
testHomepage();
}
}
您也可以采用另一种方式来做,而无需引入新的类。 在父类中声明一个抽象方法(或带有默认值的具体方法)。
class MyTestCase {
protected abstract Flour getFlour();
}
您的孩子班级将如下所示
class SomeTest extends MyTestCase {
private Flour flour;
@Test
public void testRedFlavouredHomepage() {
flour = Flour.RED;
testHomepage();
}
@Test
public void testBlueFlavouredHomepage() { // assuming Blue is my default flavour
flour = Flour.BLUE;
testHomepage();
}
public void testHomepage() {
// test some stuff
}
protected abstract Flour getFlour() {
return flour;
}
}
我会说第一种解决方案是“更清洁”。 即使您需要创建额外的类,你不包括不同类型的一个类(如在反模式的逻辑神的对象 )。
您可以使用@Rule (对于更高版本的JUnit> = 4.9)来执行此操作。 如果您有一个实现TestRule的类,特别是apply(),则可以在运行测试之前做一些额外的事情。 Description传递给apply方法,该方法包含方法上的注释:
以@Deprecated
为例:
public class ExtraSetupTest {
@Rule
public TestRule moreSetup = new TestRule() {
public Statement apply(Statement base, Description description) {
return statement(base, description);
}
private Statement statement(final Statement base,
final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
if (description.getAnnotation(Deprecated.class) != null) {
System.out.println("more setup here");
}
base.evaluate();
}
};
}
};
@Test
public void noExtraSetup() {
System.out.println("noExtraSetup");
}
@Test
@Deprecated
public void withExtraSetup() {
System.out.println("withExtraSetup");
}
}
这产生作为输出:
noExtraSetup
more setup here
withExtraSetup
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.