Модульное тестирование, спринг

  1. 5 г. назад

    На проекте спринговом заказчик хотит, чтобы сборки проходили с модульным тестированием. А я что то в этом не очень опытен. Подключил junit.
    Вообщем есть класс А в нем есть метод A.b(). В этом методе используется приватное поле private c, которое есть референс на бин, и имеет аннотацию Autowired. Соответственно на реальном серваке, это поле инициализируется спрингом и жизнь прекрасна.
    Пишу модульный тест для класса А. В классе тестирования я могу подключить этот бин и оно даже инициализиуется, но только в модуле этого класса тестирования.
    Но вызов метода А.b() делает NullPointerException, что идет от того, что поле private c этого класса Null. И как его инициализировать, чтобы протестировать метод b()?

    Ответы: (10)
  2. 19.12.2018 08:00:36 отредактировано sda553
    public class A
    {
       @Autowired private SomeSpringBean c;
    
       public void b()
    { c.someBinMethod(); // тут c null и это надо побороть
    }}
  3. [...] откуда это одинесники знают?

    Ответы: (13)
  4. Тут не только одинэсники, плюс могут быть одинэсники, сильные в айти

    Ответы: (6)
  5. Даже Бабка например, советует применять везде рефлексию но мне кажется, это какой то говнокод выйдет. Оставим рефлексию на крайний случай, должно быть решение поизящнее, я уверен

    Ответы: (5)
  6. sda553 Даже Бабка

    Чувствуется уважение к СЧ

  7. sda553 одинэсники, сильные в айти

    Кто это? Тесла?

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

    Доктор, где вы находите таких заказчиков, которые хотят то, что нужно на самом деле? Ты молиться на него должен и целовать в лобик, а не задавать глупые вопросы здесь

  9. 30 секунд гугла

    RunWith( SpringJUnit4ClassRunner.class )
    ContextConfiguration

    Ответы: (10)
  10. Ганситто за 500 р выполнит любые задачи

  11. 19.12.2018 12:20:53 отредактировано sda553

    stackoverflow 30 секунд гугла
    RunWith( SpringJUnit4ClassRunner.class )
    ContextConfiguration

    Внимательнее будь!

    sda553 я могу подключить этот бин и оно даже инициализиуется, но только в модуле этого класса тестирования.

    Так что погугли еще

  12. 19.12.2018 12:22:52 отредактировано sda553

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

  13. Ссылки в студию

    Ответы: (13)
  14. (12)
    Да, легко
    Вот реальный проект https://github.com/UnionVMS/UVMS-USM4UVMSLibrary
    Тут у парней почти та же ситуация что и у меня в сообщении (2)
    https://github.com/UnionVMS/UVMS-USM4UVMSLibrary/blob/11a511dc9d92118c58f850fd4d80c1381f35b7e3/src/main/java/eu/europa/ec/fisheries/uvms/init/AbstractModuleInitializerBean.java#L40
    А конкретно если отбросить лишнее

    public class AbstractModuleInitializerBean
    {
    	@EJB
        private USMService usmService;
    	
    	public void atSchedule()
    	{
    	//используется usmService который должен быть не null
    	}
    }

    Как же сделать модуль тест этого atSchedule() если там new ModuleInitializerBean()?
    (ModuleInitializerBean это наследник AbstractModuleInitializerBean)

    Парни покумекали/покурили и залепили в итоге тупой и говнокодной рефлексией
    https://github.com/UnionVMS/UVMS-USM4UVMSLibrary/blob/476f66bc44549df9ceaec0fd837dd8aa8405be63/src/test/java/eu/europa/ec/fisheries/uvms/init/ModuleInitializerBeanTest.java#L56

    Whitebox.setInternalState(initializerBean, "usmService", usmService);
  15. а в чём говнокод?
    P.S. парни звучит как то неполиткорректно. Коллеги может?

    Ответы: (15)
  16. 19.12.2018 14:18:06 отредактировано sda553

    (14) в том, что поле usmService должно было само проинициализироваться благодаря какой то изящной конфигурации модульного тестирования, а они тупо залепили рефлексией вида
    setInternalState(initializerBean, "usmService", usmService);

    Ответы: (16)
  17. (15) Забей.

или зарегистрируйтесь чтобы ответить!