Использование @Autowired с JMockit делает объект @Autowired нулевым

Я понимаю, что есть еще один вопрос SO, который касается именно этой проблемы (здесь). Однако в моем случае это не сработает.

У меня есть проект maven (веб/интерфейс), использующий Spring. Я добавил jmockit в jvm через pom:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.9</version>
  <configuration>
    <argLine>-javaagent:${settings.localRepository}/mockit/jmockit/0.998/jmockit-0.998.jar</argLine>
    <useSystemClassLoader>true</useSystemClassLoader>
    <forkMode>always</forkMode>
  </configuration>
</plugin>

ТРИ (сокращенно) выглядит так:

@Service
@RequestMapping("/bars")
public class BarsController{
[...]
@Autowired
private FooUtils fooUtils;

[...]    
@RequestMapping(value = "/get", method = RequestMethod.POST)
public ModelAndView getBars(){
    ModelAndView mav = new ModelAndView();
    Session session = fooUtils.getSession();
[...]

Теперь я действительно хотел бы смоделировать экземпляр FooUtils в своем тесте. Следуя совету, данному в этом вопросе SO, я попробовал:

@RunWith(JMockit.class)
public class BarsControllerTest {

@Autowired BarsController unitUnderTest;
@Mocked Session session;

@Before
public void setUp()
{
    FooUtils foo = new MockUp <FooUtils>() {
        @Mock
        Session getSession() {
            return session;
        }
    }.getMockInstance();

    mockit.Deencapsulation.setField(unitUnderTest, foo);
}

Увы, unitUnderTest, а также foo оба являются null, в результате чего происходит следующее:

java.lang.NullPointerException
    at net.manniche.thebars.BarsControllerTest.setUp(BarsControllerTest.java:40)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:172)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:78)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:70)
  • Что довольно неожиданно, так как я ожидал, что new MockUp<...>{}.getMockInstance() вернет какой-то объект.

Я предполагаю, что я просто пропускаю какую-то важную часть, но какую?


person Steen    schedule 08.08.2011    source источник
comment
Почему решение в другом вопросе не работает для вас?   -  person skaffman    schedule 09.08.2011
comment
@skaffman: Хотел бы я знать :) Как я уже говорил в своем вопросе, проблема для меня в том, что издевательский объект имеет значение null, чего я не ожидал и не понимал. Инструкции, данные в другом вопросе, завели меня так далеко, но не дальше. Это решило проблему другого парня, за что я ему завидую, но я не хотел продолжать дискуссию в этом вопросе, так как он уже был решен (для его случая)   -  person Steen    schedule 10.08.2011