ResourceBundle.getBundle, возвращающий реальный объект, несмотря на mockStatic и когда () указывает иначе - PullRequest
0 голосов
/ 01 октября 2019

Я создаю тесты поверх существующих классов. У некоторых из них пакет ресурсов определен как закрытое конечное поле, которое инициализируется при создании объекта с помощью new. Я объявляю смоделированный ResourceBundle, использую метод mockStatic PowerMock, чтобы включить статическое моделирование, и смоделирую метод getBundle, чтобы вернуть мой смоделированный ResourceBundle. Однако, когда конструктор запускает код для инициализации поля, он просто создает новый пакет ресурсов, а не использует поддельный. Я чувствую, что есть одна маленькая деталь, которую я пропустил, но я не знаю, что это может быть. Причина всего этого заключается в следующем: когда я запускаю тест локально, он создает объект ResourceBundle без проблем. Но когда тест запускается с помощью нашего программного обеспечения для сборки (UCBuild), он выдает исключение «не удается найти ресурс», и тест, и, следовательно, сборка, завершается неудачей.

Когда я запускаю тест в режиме отладки иустановив точку останова метода на конструкторе, я вижу, что объект "strings" создается с использованием фактического пакета ресурсов, а не поддельного. Я не могу понять, почему.

Я пытался объявить поле без его инициализации, а затем с помощью class.getDeclaredField () и Field.setAccesible () установить пакет ресурсов в точкуна моем поддельном, но, конечно, это просто перезаписывается, если я запускаю код, который повторно инициализирует поле.

Класс WorkerTest, который проверяет Worker.java:

@RunWith(PowerMockRunner.class)
@PrepareForTest({FacesContext.class, SaveStatus.class, FacesMessage.class, ResourceBundle.class})
public class WorkerTest {
@Mock
    private ResourceBundle mockRB;

    @Before
    public void setUp() throws Exception {
        PowerMockito.mockStatic(ResourceBundle.class);
        PowerMockito.when(ResourceBundle.getBundle(anyString())).thenReturn(mockRB);
        PowerMockito.when(mockRB.getString(anyString())).thenReturn("tst");

        sut = new Worker();  // Breakpoint here to verify mockRB exists
    }
...some tests
}

Worker.java:

@Named
@ApplicationScoped
public class Worker implements Serializable {
    private static final long serialVersionUID = 4075799125164038417L;
    private final ResourceBundle strings = ResourceBundle
            .getBundle("com.resources.strings");

    public Worker() {  //method breakpoint here

    }

Заранее спасибо

1 Ответ

0 голосов
/ 03 октября 2019

Нашел проблему. Добавление Worker.class в строку аннотации @PrepareForTest и все работало нормально.

...