Я довольно потерян на этом. У меня есть некоторые тесты приемлемости, работающие с JUnit4 на основе Spring. Теперь я также хочу добавить модульные тесты. Чтобы сделать их быстрыми, я пропускаю контекст и внедряю макеты с помощью PowerMock.
Однако внезапное отражение больше не сработает.
public class TestSomething {
@Test
public void nothingWrongWithThis() {
Class<?> type = Client.class;
type.getDeclaredMethods();
}
}
Вторая строка будет возвращать ноль, как и любой другой вызов метода, кроме getName ()
Если я использую контекст, однако он будет работать:
@TransactionConfiguration
@ContextConfiguration({ "classpath:dw-product-context-test.xml" })
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
public class TestSomething {
@Test
public void nothingWrongWithThis() {
Class<?> type = Client.class;
type.getDeclaredMethods();
}
}
Что здесь не так? Разве отражение не должно работать без какого-либо бегуна или контекста?
Даже не добавляя строку
private Client client = new Client();
изменит что-либо (подумал, может быть, время выполнения, необходимое для инициализации класса, чтобы иметь возможность размышлять над ним)
Да и добавление
@RunWith(PowerMockRunner.class)
тоже ничего не изменит.
Есть идеи?
Спасибо!
PS: Буду отсутствовать в городе, начиная с сегодняшнего дня, поэтому я прочитаю любой ответ через 35 часов.
Редактировать
Просто выяснил, что происходит:
Я начал в своем отладчике и открыл Client.class.declaredMethods
, который был null
. Однако, когда я запускаю getDeclaredMethods()
, он их получит. Так что сначала все выглядело как нулевое, что меня смутило, но отладчик просто не запускал get...()
на всех полях, оставляя их null
изначально
Если я использую контекст весны, он загрузит все bean-компоненты (Client
- это @Entity
) и заполнит все поля отражения мягкими ссылками, как если бы я вызвал get..()
для всех из них.