Тест-тесты во внутренних классах с JUnit
Я читал о Структурировании модульных тестов с наличием тестового класса для каждого класса и внутреннего класса для каждого метода. Понял, что это удобный способ организовать тесты, поэтому я попробовал это в нашем проекте Java. Тем не менее, тесты во внутренних классах, похоже, вообще не подбираются.
Я сделал это примерно так:
public class DogTests
{
public class BarkTests
{
@Test
public void quietBark_IsAtLeastAudible() { }
@Test
public void loudBark_ScaresAveragePerson() { }
}
public class EatTests
{
@Test
public void normalFood_IsEaten() { }
@Test
public void badFood_ThrowsFit() { }
}
}
Неужели JUnit не поддерживает это, или я просто делаю это неправильно?
Ответы
Ответ 1
public class ServicesTest extends TestBase {
public static class TestLogon{
@Test
public void testLogonRequest() throws Exception {
//My Test Code
}
}
}
Создание внутреннего класса static работает для меня.
Ответ 2
Вы должны аннулировать свой класс с помощью @RunWith(Enclosed.class)
, и, как и другие, объявите внутренние классы статическими:
@RunWith(Enclosed.class)
public class DogTests
{
public static class BarkTests
{
@Test
public void quietBark_IsAtLeastAudible() { }
@Test
public void loudBark_ScaresAveragePerson() { }
}
public static class EatTests
{
@Test
public void normalFood_IsEaten() { }
@Test
public void badFood_ThrowsFit() { }
}
}
Ответ 3
Я думаю, что некоторые из ответов могут быть для более старых версий JUnit. В JUnit 4 это сработало для меня:
@RunWith(DogTests.class)
@SuiteClasses({ DogTests.BarkTests.class, DogTests.EatTests.class })
public class DogTests extends Suite
{
public DogTests(Class<?> klass, RunnerBuilder builder) throws InitializationError {
super(klass, builder);
}
public static class BarkTests
{
@Test
public void quietBark_IsAtLeastAudible() { }
@Test
public void loudBark_ScaresAveragePerson() { }
}
public static class EatTests
{
@Test
public void normalFood_IsEaten() { }
@Test
public void badFood_ThrowsFit() { }
}
}
Ответ 4
У меня был успех с Nitor Creation Nested Runner.
Как использовать Nitor Creation Nested Runner
Существует сообщение объясняющее его здесь:
Добавьте эту зависимость:
<dependency>
<groupId>com.nitorcreations</groupId>
<artifactId>junit-runners</artifactId>
<version>1.2</version>
<scope>test</scope>
</dependency>
И a @RunWith
к вашему тесту:
import com.nitorcreations.junit.runners.NestedRunner
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
@RunWith(NestedRunner.class)
public class RepositoryUserServiceTest {
public class RegisterNewUserAccount {
public class WhenUserUsesSocialSignIn {
public class WhenUserAccountIsFoundWithEmailAddress {
@Test
public void shouldThrowException() {
assertTrue(true);
}
}
}
}
}
PS: Примерный код был взят и изменен из вышеупомянутого сообщения в блоге
Ответ 5
В JUnit 5 вы просто отмечаете нестатические внутренние классы как @Nested
:
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
public class DogTests {
@Nested
public class BarkTests {
@Test
public void quietBark_IsAtLeastAudible() { }
@Test
public void loudBark_ScaresAveragePerson() { }
}
@Nested
public class EatTests {
@Test
public void normalFood_IsEaten() { }
@Test
public void badFood_ThrowsFit() { }
}
}