NullPointerException при тестировании синглтона в Java EE - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу протестировать метод getCitation () с помощью jUnit:

@Singleton
public class QuotesLoaderBean {

Properties quotes;
Properties names;

@PostConstruct
public void init() {
    InputStream quotesInput = this.getClass().getClassLoader().getResourceAsStream("quotes.properties");
    InputStream namesInput = this.getClass().getClassLoader().getResourceAsStream("names.properties");

    quotes = new Properties();
    names = new Properties();
    try {
        quotes.load(quotesInput);
        names.load(namesInput);
    } catch (IOException ex) {
        Logger.getLogger(QuotesLoaderBean.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public Citation createCitation(String quote) {
    Citation citation = new Citation();
    citation.setQuote(quote);
    citation.setWho(getName());
    return citation;
}

public Citation getCitation() {
    Citation citation = new Citation();
    citation.setQuote(getQuote());
    citation.setWho(getName());
    return citation;
}

В тестовом файле я хочу внедрить синглтон и использовать его в тестовом методе. Но затем я получаю исключение NullPointerException:

public class QuoteServiceTest {
@Inject
QuotesLoaderBean quotesLoaderBean;

public QuoteServiceTest() {
}

@BeforeClass
public static void setUpClass() {
}

@AfterClass
public static void tearDownClass() {
}

@Before
public void setUp() {
}

@After
public void tearDown() {
}

@Test
public void whenGetQuote_thenQuoteShouldBeReturned() {
    quotesLoaderBean.getQuote();
}

}

Метод тестирования не завершен, но я просто хочу показать исключение, которое происходит, когда я вызываю метод из Singleton. В другом классе обслуживания я могу легко внедрить класс и вызвать методы.

1 Ответ

0 голосов
/ 11 апреля 2020

Инъекция обрабатывается контейнером с поддержкой DI во время выполнения. При развертывании всего приложения устанавливается контейнер и инъекция работает нормально. При выполнении модульных тестов ни одна из служб не запускается, и любой @Inject будет заканчиваться переменной с нулевым значением, поскольку ни один контейнер не будет запущен.

Итак, чтобы протестировать свой код, вы может захотеть построить сервис внутри setUp метод:

public class QuotesServiceTest {

    QuotesLoaderBean quotesLoaderBean;

// ...
    @Before
    public void setUp() {
        quotesLoaderBean = new QuotesLoaderBean();
        // call init method after construction
        quotesLoaderBean.init();
    }
// ...
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...