2015-07-27 4 views
4

Для хорошей части тестов, которые я выполняю для своего приложения, у меня есть общий набор настроек и отрыв.Автоматически заполнять настройку и отключение JUnit

Когда я создаю новый класс JUnit Test Case, у меня есть возможность для eclipse автоматически создавать методы setUp() и tearDown().

Есть ли способ изменить методы setUp и TearDown по умолчанию, чтобы иметь некоторые пользовательские строки кода?

Так что, когда я создаю новый тестовый класс с методом нАлАдкИ проверили я получаю:

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

импорта не должен быть проблемы, поскольку она будет автоматически импортировать нужный пакет на сохранения.

ответ

2

Если вы хотите изменить выход нового мастера JUnit Test Case Eclipse, это невозможно без перезаписи исходного кода плагина. Сгенерированный код: 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 
    } 
} 
+0

Достойный ответ, но это помешало бы мне продлить MyTest от всего остального. Кроме того, это означало бы, что мне пришлось бы писать extends Common каждый раз – Aequitas

+0

Если вы пишете один и тот же код для каждого тестового примера, не хотите ли вы, чтобы он был определен только один раз, и так же просто включить в качестве 'extends Common'? Если вы хотите изменить мастер JUnit Test Case для генерации другого кода, это невозможно, если вы не перепишете плагин. –

+0

Хорошо, спасибо, вот что я хотел знать. Если вы включите свой комментарий в свой ответ, что-то вроде «это невозможно без написания плагина, самая быстрая альтернатива была бы следующей:« Я приму ваш ответ – Aequitas

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."); 
    } 

} 
+0

Это именно то, что я делаю, но я хочу 'WidgitUserTestSetupUtil.setUp(); 'и tearDown выполняется автоматически, а не писать каждый раз – Aequitas

+0

Возможно, вы можете что-то сделать в AspectJ или Spring AOP: http://stackoverflow.com/questions/3805317/execute-code-before-and- after-method – John

1

Если вы действительно видите это стоит, вы могли бы написать свой собственный обработчик аннотации. Затем либо обработайте все, у вас есть аннотация @Test, либо можете добавить свою аннотацию @VerySpecialTestWithGeneratedSetupAndTeardown и добавить ее к классам/методам, которые вы хотите обработать.

Это будет целая куча кода, так что вам нужно будет иметь много тестов, чтобы оправдать это, но здесь хороший пошаговое руководство по написанию аннотаций Processors: http://hannesdorfmann.com/annotation-processing/annotationprocessing101/

0

Вы можете написать правило JUnit, который расширяет TestWatcher и движение ваш код к методам starting и finished.

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(); 

    ... 
} 
Смежные вопросы