自动填充JUnit设置和拆卸

时间:2015-07-27 23:21:32

标签: java eclipse junit

对于我为我的应用程序执行的大部分测试,我有一个共同的setUp和tearDown。

当我创建一个新的JUnit Test Case类时,我有一个eclipse选项可以自动创建setUp()和tearDown()方法。

有没有办法更改默认的setUp和TearDown方法以获得一些自定义代码行?

因此,当我使用setUp方法创建一个新的测试类时,我得到:

@Before
public void setUp() throws Exception
{
    UnitTestSetup.standardSetup();
}

导入不应该是一个问题,因为它会在保存时自动导入所需的包。

4 个答案:

答案 0 :(得分:2)

如果您希望更改Eclipse新JUnit测试用例向导的输出,那么在不重写插件的源代码的情况下这是不可能的。生成的代码为hard-coded into the wizard

        buffer.append("void "); //$NON-NLS-1$
        buffer.append(methodName);
        buffer.append("() throws "); //$NON-NLS-1$
        buffer.append(imports.addImport("java.lang.Exception")); //$NON-NLS-1$
        buffer.append(" {}"); //$NON-NLS-1$
        buffer.append(delimiter);

JUnit支持继承。将常见@Before@After应用于测试用例的一种方法是将它们放在一个公共父类中,并在测试用例中继承它:

public class Common {
     @Before
     public void setUp() {
         ...
     }
     @After
     public void tearDown() {
         ...
     }
}

public class MyTest extends Common {
    @Test
    public void test() {
        // Common.setUp() will have been run before this test
        // Common.tearDown() will run after the test
    }
}

答案 1 :(得分:1)

如果你真的觉得它值得,你可以编写自己的注释处理器。然后让它处理具有@Test注释的所有内容,或者拥有自己的@VerySpecialTestWithGeneratedSetupAndTeardown注释,并将其添加到要处理的类/方法中。

这将是一大堆代码,所以你需要有大量的测试来证明这一点,但这里是编写注释处理器的一个很好的演练:http://hannesdorfmann.com/annotation-processing/annotationprocessing101/

答案 2 :(得分:0)

为什么不创建一个类来执行代码来执行设置,另一个类来执行拆卸并使用这些类来封装分别进行设置和拆除所需的逻辑。然后,您可以从任何地方和何时需要它来调用此逻辑。

这样的事情:

商务舱:

package com.foo.bar.businesslogic.woozinator;

public class Woozinator {

    public void doSomething() {
        System.out.println("Doing something.");
        System.out.println("Done.");
    }

}

测试类:

package com.foo.bar.businesslogic.woozinator;

import org.junit.Test;

import com.foo.bar.businesslogic.testutil.WidgitUserTestSetupUtil;
import com.foo.bar.businesslogic.testutil.WidgitUserTestTearDownUtil;

public class WoozinatorTest {

    @Test
    public void shouldPassTest() {
        WidgitUserTestSetupUtil.setUp();
        // do test stuff here
        WidgitUserTestTearDownUtil.tearDown();
    }

}

设置类:

package com.foo.bar.businesslogic.testutil;

public class WidgitUserTestSetupUtil {

    public static void setUp() {
        System.out.println("Setting up widget environment for widget user test");
        // do stuff here
        System.out.println("Done setting up environment");
    }

}

撕下课程:

package com.foo.bar.businesslogic.testutil;

public class WidgitUserTestTearDownUtil {

    public static void tearDown() {
        System.out.println("Doing woozinator tear down.");
        // undo stuff here
        System.out.println("Done with woozinator tear down.");
    }

}

答案 3 :(得分:0)

您可以编写一个扩展TestWatcher的JUnit规则,并将代码移至方法startingfinished

public class YourRule extends TestWatcher {
  @Override
  protected void starting(Description description) {
    UnitTestSetup.standardSetup();
    //more of your code
  }

  @Override
  protected void finished(Description description) {
    //your code
  }
}

在每项测试中使用此规则:

public class YourTest {
  @Rule
  public final YourRule yourRule = new YourRule();

  ...
}