Я создаю тесты поверх существующих классов. У некоторых из них пакет ресурсов определен как закрытое конечное поле, которое инициализируется при создании объекта с помощью 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
}
Заранее спасибо