2012-05-24 3 views
3

Я сталкиваюсь с этими странными проблемами при тестировании одной из моих услуг ... Я издеваюсь над двумя службами с easymock 3.0 и впрыскиваю их с помощью Spring, но я получаю «java.lang.IllegalArgumentException: Не один из них: $ Proxy43 "исключение в одном из них. Я объявляя их так же, как в моем файле конфигурации, например:Easy mock не распознает насмешливое обслуживание

<bean id="recurringSchedulesJobsService" class="org.easymock.EasyMock" factory-method="createMock"> 
    <constructor-arg value="com.spmsoftware.recurringschedules.service.RecurringSchedulesJobsService"/> 
</bean> 

<bean id="jobPeriodService" class="org.easymock.EasyMock" factory-method="createMock"> 
    <constructor-arg value="com.spmsoftware.jobdefinition.service.JobPeriodService"/> 
</bean> 

В моих тестах JUnit, я буду их помощь на следующих путях:

@Autowired 
private RecurringSchedulesJobsService recurringSchedulesJobsService; 
@Autowired 
private JobPeriodService jobPeriodService; 

@Before 
public void setUp() throws Exception { 
    reset(recurringSchedulesJobsService); 
    expect(recurringSchedulesJobsService.getBasedOnRecurringScheduleId(RECURRING_SCHEDULE_ID)).andReturn(buildRecurringScheduleJob()); 
    replay(recurringSchedulesJobsService); 

    reset(jobPeriodService); 
    expect(jobPeriodService.findPeriodByJobId(RECURRING_SCHEDULE_JOB_ID)).andReturn(buildJobDefinitionPeriod()); 
    replay(jobPeriodService); 
} 

recurringSchedulesJobsService получает высмеивали и когда я комментарий второй службы, он ведет себя так, как ожидалось. jobPeriodService, с другой стороны, не признается как макет. Вместо этого я получаю это исключение:

java.lang.IllegalArgumentException: Not a mock: $Proxy43 
at org.easymock.internal.ClassExtensionHelper.getControl(ClassExtensionHelper.java:66) 
at org.easymock.EasyMock.getControl(EasyMock.java:2068) 
at org.easymock.EasyMock.reset(EasyMock.java:1983) 
at com.spmsoftware.recurringschedules.occurrences.generator.OccurrenceGeneratorTest.setUp(OccurrenceGeneratorTest.java:64) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) 
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:63) 

Исключение брошено только быть метод сброса(), хотя ...

Одна интересная вещь, я обнаружил, что два объекта не одного и того же экземпляра. Это то, что я получаю при отладке:

enter image description here

Любые идеи о том, что это будет очень ценным. Thanks

+0

Являются ли оба повторяющихся интерфейсаSubsulesJobsService и jobPeriodService интерфейсами? – SantoshK

+0

Да, они ... – sebi

ответ

5

Spring переносит компонент в прокси-сервер, возможно, для применения AOP-аспектов (транзакций, безопасности) вокруг методов. Таким образом, компонент, который он вводит внутри вашего теста, является прокси-сервером Spring вокруг макета, а не макетом.

Почему вы используете контекст весны и инъекции зависимостей? Вы можете просто создать экземпляр своего объекта службы в своем модульном тесте, ввести в него ложные зависимости и протестировать его. Для этого нет необходимости в контейнере Spring. Это, вероятно, основная интересная особенность в рамках IoC: это делает модульные тесты просто:

@Before 
public void setUp() { 
    this.recurringSchedulesJobsService = mock(RecurringSchedulesJobsService.class); 
    this.jobPeriodService = mock(JobPeriodService.class); 
} 

@Test 
public void testSomeMethod() { 
    expect(recurringSchedulesJobsService.doThis()).andReturn(that); 
    expect(jobPeriodService.doThat()).andReturn(1); 

    replay(recurringSchedulesJobsService, jobPeriodService); 

    MyServiceImplementation serviceToTest = 
     new MyServiceImplementation(recurringSchedulesJobsService, jobPeriodService); 
    serviceToTest.someMethod(); 
    verify(recurringSchedulesJobsService, jobPeriodService); 
} 
+0

Спасибо за быстрый ответ. \t Я использую весну, так что мне не нужно вводить все зависимости jobPeriodService. Я пробовал программный подход, но мне приходится обрабатывать все другие службы, которые я обычно использую autowire в jobPeriodService. Во всяком случае, почему весна ведет себя так же, как мой второй макет? Почему первая работа? – sebi

+2

jobPeriodService - макет. Нечего вводить в насмешку !? –

+0

Я получаю NPE, когда пытаюсь использовать его из-за null entityManager – sebi

0

Похоже jobPeriodService идет автоматически проксированном к весне, тогда как recurringSchedulesJobsService нет. Скорее всего, это связано с тем, что Spring отмечен как повторяющийсяSchedulesJobService, который не имеет права на автоматическое проксирование (нет потенциального соответствия pointcut, он явно отключен где-то и т. Д.). Я не знаю, какова конкретная причина, не глядя на вашу другую конфигурацию.

Если вы добавите уровень ведения журнала Spring в DEBUG, он должен сказать вам, почему recurringSchedulesJobService не имеет права на автопроксирование.

+0

Я с JB Nizet. Вы делаете это слишком сложно. –

Смежные вопросы