Spring MVC - переопределить бин для одного интеграционного теста - PullRequest
0 голосов
/ 25 августа 2018

У меня есть проект с пружиной MVC v5.0.8, Java 8
Я сделал несколько интеграционных тестов от контроллера к базе данных, и теперь я хочу добавить тест, который будет проверять, что произойдет, если первая часть транзакционного поведения не удалась. Я гарантирую, что транзакция будет эффективно откатываться.
Итак, я должен переопределить DAO, чтобы он потерпел неудачу. После некоторых исследований возникла простая идея: переопределить конфигурацию пружины для этого теста: Переопределение бина с автопроводкой в ​​модульных тестах
Мой тест теперь работает нормально, но проблема в том, что эта конфигурация используется совместно с другим тестом из других классов, даже если он находится в одном классе. Как я могу сделать это конкретным для этого теста?

(Если создание b завершилось неудачно, a необходимо откатить) Неудачный тест:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@EnableWebMvc
@Sql({"/sqlfiles/clean-data.sql"})
public class AControllerFailDaoIt {

    @Configuration
    static class ConfigFailDao extends ApplicationConfiguration{
        @Bean
        @Primary
        public BDao getBDao() {
            return new BDao() {
                //Overriding method to make it fail
            };
        }
    }

    @Autowired
    AController aController;

    @Autowired
    ADao aDao;

    @Test
    public void should_not_create_a_if_b_failed(){
        //creation of a

        //assert nor a nor b are created
    }
}

Номинальный тестовый набор:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@EnableWebMvc
@ContextConfiguration(classes = {ApplicationConfiguration.class, CustomWebAppConfiguration.class})
@Sql({"/sqlfiles/clean-data.sql"}) //"/sqlfiles/account-test.sql"
public class AControllerIT {

    @Autowired
    AController aController;

    @Autowired
    ADao aDao;

    @Autowired
    BDao bDao;

    @Test
    public void should_create_a_and_corresponding_b(){
        //create a
        //assert that both a and b are created
    }
}

ApplicationConfiguration (специфичная для теста)

@Configuration
@ComponentScan(basePackages = "my.base.package")
class ApplicationConfiguration implements WebMvcConfigurer {
}

Примечание. Мои классы по тестированию интеграции входят в базовый пакет, имеет ли это значение?
Я нашел вариант: поместить конфигурацию теста на отказ во внешний класс и вызывать ее только в моем тесте на ошибку, но он все равно не работает.
На данный момент у меня закончились идеи, поэтому я буду рад вашей помощи!

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Я получил это работает.Плохо, так что, если у вас есть лучший вариант, я нахожусь. Но я не нашел способа заставить мой тест провалиться по данным ... Что было бы лучше.
Итак, я 'мы обнаружили, что аннотация @Configuration делает класс сканированным. Spring doc .
Я только что сделал свою неудачную конфигурацию во внешнем классе и удалил аннотацию @Configuration.Так что он не будет сканироваться другой тестовой конфигурацией.Затем в моем классе теста на неудачу я ссылался на него в аннотации @ContextConfiguration, поэтому он используется.Таким образом, это работает нормально.Теперь у меня проблема с @Transactional, но это не та тема.
Благодаря респондентам, вы заставили меня посмотреть в правильном направлении: -)

0 голосов
/ 26 августа 2018

Я предлагаю вам использовать аннотацию @Qualifier.

  1. Вместо того, чтобы ставить @Primary выше метода getBDao () в вашей конфигурации, поместите @Qualifier с некоторым именем i.e.:

    @Bean
    @Qualifier("BDaoTest")
    public BDao getBDao() {
        return new BDao() {
            //Overriding method to make it fail
        };
    }
    
  2. После этого установите @Primary в свою реализацию BDao по умолчанию (в конфигурации по умолчанию).

  3. Затем, когда вы автоматически подключите этот bean-компонент в своем тесте, вам нужно добавить этот классификатор:

    @Autowired
    @Qualifier("BDaoTest")
    BDao bDao;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...