Тестовый модуль Spring Boot запускает всю программу - PullRequest
1 голос
/ 28 марта 2020

Я хотел бы реализовать интеграционный тест с Spring Boot. Я начинаю с зависимости spring-boot-starter-test, версия 2.2.5.RELEASE.

У меня есть следующий компонент:

@Component
public class MyMath {

    public int add(int a, int b) {
        return a + b;
    }

}

Основная программа выглядит так:

@SpringBootApplication
public class Main implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }

    @Autowired
    private MyMath myMath;

    @Override
    public void run(String... args) throws Exception {
        System.out.println(myMath.add(2, 3));
    }

}

Работает как положено - пока все хорошо. Я хотел бы добавить модульный тест:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyMathTest {

    @Autowired
    private MyMath myMath;

    @Test
    public void testSaveAndList() {
        assertEquals(5, myMath.add(2, 3));
    }

}

Это также работает, но согласно журналу выполняет всю программу . Я не хочу запускать саму программу, просто функцию MyMath.add(). Как я могу это сделать?

До сих пор я пробовал следующее:

  • @RunWith(SpringJUnit4ClassRunner.class) при условии того же результата.
  • Пропуск @SpringBootTest результаты NoSuchBeanDefinitionException .
  • Переформатирование кода для создания компонента вместо компонента, как показано ниже.

MyMath без аннотации:

public class MyMath {

    public int add(int a, int b) {
        return a + b;
    }

}

Main остается то же самое.

@Configuration
public class AppConfig {

    @Bean
    public MyMath getMyMath() {
        return new MyMath();
    }
}

И тест:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class MyMathTest {

    @Autowired
    private MyMath myMath;

    @Test
    public void testSaveAndList() {
        assertEquals(5, myMath.add(2, 3));
    }

}

Поэтому я не могу протестировать компонент без запуска всей программы. Может ли кто-нибудь мне помочь? Спасибо!

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Вам не нужно рефакторинг вашего кода. Просто сохраните класс MyMath таким, как он есть

@Component
public class MyMath {

    public int add(int a, int b) {
        return a + b;
    }
}

Измените свой тестовый класс следующим образом

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyMath.class)
public class MyMathTest {

    @Autowired
    private MyMath myMath;

    @Test
    public void testSaveAndList() {
        assertEquals(5, myMath.add(2, 3));
    }

}

Это становится немного сложным, если у вашего класса MyMath есть другие зависимости, автоматически подключенные. Тогда вы должны использовать макеты.

0 голосов
/ 28 марта 2020

Если ваш класс MyMath очень прост, я бы не использовал Spring для его инициализации. В этом нет необходимости, а главное - джунит должен быть быстрым. Поэтому вместо запуска теста с Spring Context измените его на простой JUnit и создайте MyMath как обычный объект:

public class MyMathTest {

    private MyMath myMath = new MyMath();

    @Test
    public void testSaveAndList() {
        assertEquals(5, myMath.add(2, 3));
    }

}
...