2015-10-21 3 views
4

TL; DR Как написать единичные тесты для кода платформы NetBeans, который использует статические методы для поиска зависимостей?Как проверить код платформы NetBeans, который использует Lookups?

В приложении платформы NetBeans я сталкиваюсь кода, как это:

MyService service = Lookup.getDefault().lookup(MyService.class); 
service.doStuff(....); 

мне статический доступ кажется как антипаттерн и трудно проверить. Когда я вокруг Google, я только нахожу комментарии о низкой связи и высокой когезии, телеинтерфейсах и т. Д.

Многие люди, похоже, think this is a Good Idea, но мне интересно, как я могу написать разумный модульный тест для такого кода, не прибегая к издевательским статическим методам или с помощью функции Lookup в моем модульном тесте.

Первая мысль, которая приходит на ум, чтобы реорганизовать поиск как регулярная зависимость:

public class MyClass { 

    private Lookup lookup = Lookup.getDefault(); 

    public void myMethod() { 
     MyService service = lookup.lookup(MyService .class); 
     service.doStuff(....); 
    } 

    public void setLookup(Lookup lookup) { 
     this.lookup = lookup; 
    } 

И затем использовать сеттер предоставить макет Lookup для тестирования.

Это будет работать, но все же вызывает проверку кода, вызванного Lookup.getDefault(), прежде чем устанавливать макет. Не существует регулярного механизма впрыска зависимостей, предоставляемого платформой Netbeans, поэтому, если я его внедряю, похоже, что он плавает против потока.

У меня такое чувство, что я чего-то не хватает. Существует ли стандартный подход для написания модульных тестов для кода платформы Netbeans?

ответ

3

До сих пор я нашел несколько способов решения этой проблемы.

1 - Опубликовать тестовую версию класса в Lookup с более высокой позиции

@org.openide.util.lookup.ServiceProvider(service = MyService.class, position = 1) 
public class TestService implements MyService { 
    public void doStuff(....) { 

2 - Использовать NBJunit в MockService

public class MyTest extends NbTestCase { 
    public void setUp() throws Exception {  
     org.netbeans.junit.MockServices.setServices(TestService.class); 
    } 

3- Регистрация собственную реализацию подстановок:

static { 
    System.setProperty("org.openide.util.Lookup", TestLookup.class.getName()); 
} 

public class TestLookup extends org.openide.util.lookup.AbstractLookup { 
    public TestLookup() { 
     this(new org.openide.util.lookup.InstanceContent()); 
    } 

    private TestLookup(org.openide.util.lookup.InstanceContent ic) { 
     super(ic); 
     ic.add(new TestService()); 
    } 

Некоторые из этих идей были найдены здесь: https://openide.netbeans.org/tutorial/test-patterns.html.

+0

Почему вы должны зарегистрировать свой собственный поиск? – Aguid

+0

Потому что он просматривается через статический вызов рамки в тестируемом коде. –

0

Класс TestService должен быть виден в вашем тестовом классе (В общем, мы используем Lookup для ослабления зависимости, поэтому интерфейсы и реализации находятся в отдельных модулях).

Подумайте о добавлении модуля TestService в независимость вашего тестового модуля.

+0

Я не понимаю, что вы имеете в виду. Не могли бы вы привести пример? –

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