Я иногда использую org.apache.commons.beanutils.MethodUtils
( api link ). Я обычно избегаю рефлексии, но, увы, этот случай требует этого.
Моя проблема касается тестирования. Я использую Mockito для насмешек, и когда я вызываю MethodUtils.invokeMethod
с насмешкой в качестве аргумента, MethodUtils выдает NoSuchMethodError
, потому что считает, что смоделированный объект не соответствует типу параметра. Есть предложения?
Подпись конкретного метода, по которому я звоню:
public void propagateMirrorRateOfferId(MasterAvailabilityRule masterAvailabilityRule)
Мое издевательское поколение:
@RunWith(MockitoJUnitRunner.class)
public class SomeTest {
private static final Long RATE_OFFER_ID = 1L;
private static final Long RATE_ENTITY_ID = 2L;
private static final Long ORIGINAL_RATE_OFFER_ID = 3L;
private static final Long ORIGINAL_RATE_ENTITY_ID = 4L;
@Mock MasterAvailabilityRule masterAvailabilityRule;
PropertyAvailabilityRule propertyAvailabilityRule;
@Before
public void setUp() throws Exception {
propertyAvailabilityRule = new PropertyAvailabilityRule();
propertyAvailabilityRule.setMirrorRateOfferId(ORIGINAL_RATE_OFFER_ID);
propertyAvailabilityRule.setMirrorRateEntityId(ORIGINAL_RATE_ENTITY_ID);
}
@Test
public void testPropagate() throws Exception {
// arrange
when(masterAvailabilityRule.determineAvailabilityMirroringRelationship(any(String.class))).
thenReturn(new AvailabilityMirroringRelationship(RATE_OFFER_ID, RATE_ENTITY_ID));
when(masterAvailabilityRule.isMirrorLocked()).
thenReturn(true);
// action
SomeUtility.thatCallsMethodUtilsAndPassesThisMock(masterAvailabilityRule);
// assert
assertEquals("Should have updated the mirrored rate offer id.", RATE_OFFER_ID, propertyAvailabilityRule.getMirrorRateOfferId());
assertEquals("Should have updated the mirrored rate entity id.", RATE_ENTITY_ID, propertyAvailabilityRule.getMirrorRateEntityId());
}
}
Спасибо всем, разобрались
Придумывая примеры для вас, ребята, я поместил вызов MethodUtils непосредственно в мой тест, и он сработал. Оказывается, я импортировал класс MethodUtils из org.apache.commons.lang.reflect.MethodUtils
в моем служебном классе. По какой-то причине эта версия класса терпит неудачу с издевательствами. Когда я использую org.apache.commons.beanutils.MethodUtils
, это работает. Не уверен почему. Возможно, мне следует обновить свой первоначальный вопрос, чтобы спросить, почему не работает тот, который находится в пакете reflect
... В любом случае, мой вопрос будет помечен как ответившийся, как только пройдет достаточно времени, чтобы я мог представить ответ.