Mockito не издевается в весеннем тесте контроллера MVC

У меня есть контроллер

@Controller
public class AuthorController {

    @Autowired
    private AuthorDAO authorDao;

    @RequestMapping("/authors")
    public String showAuthor(@RequestParam String name, ModelMap model) {
        Author author = authorDao.findByName(name);
        model.addAttribute("author", author);

        return "authors";
    }

}

Я написал тест для этого

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:test-application-context.xml"})
public class AuthorControllerTest {

    private static final String JACK_C = "Jack C.";

    @Autowired
    AuthorController controller;

    @Test
    public void testShowAuthor() {

        Author expectedAuthor = new Author();

        AuthorDAO daoMock = mock(AuthorDAO.class);

        when(daoMock.findByName(JACK_C)).thenReturn(expectedAuthor);

        ModelMap model = new ModelMap();

        String view = controller.showAuthor(JACK_C, model);
        assertEquals("View name is incorrect","authors", view);

        assertSame(expectedAuthor, model.get("author"));
        verify(daoMock).findByName(JACK_C);
    }

}

тест-приложение-context.xml:

<context:annotation-config />
    <context:component-scan base-package="com.github.futu" />   

     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
        <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property 
        name="url" value="jdbc:mysql://localhost:3306/blog" /> <property name="username" 
        value="blogger" /> <property name="password" value="blogger" /> </bean>

    <bean id="com.github.futu.dao.AuthorDAO" class="com.github.futu.dao.impl.AuthorDAOXml"/> 

    <bean id="com.github.futu.dao.PostDAO" class="com.github.futu.dao.impl.PostDAOXml" />       

    <bean id="validator" class="com.github.futu.validator.PostValidator" /> 

Но настоящее дао называется. Что я пропустил?


person Constantine Gladky    schedule 20.12.2013    source источник
comment
Когда называется настоящий Дао?   -  person Sotirios Delimanolis    schedule 20.12.2013
comment
В контроллере. Я понял, что в контроллере используется не издеваемый DAO, но я не знаю, как внедрить издевающийся DAO в контроллер.   -  person Constantine Gladky    schedule 20.12.2013


Ответы (1)


Вы создаете здесь макет

AuthorDAO daoMock = mock(AuthorDAO.class);

это совершенно не связано с вашим контроллером, введенным в ваш тестовый класс

@Autowired
AuthorController controller;

Конечно, автоматически подключенная AuthorDao цель будет исходить из вашей конфигурации XML.

@Autowired
private AuthorDAO authorDao;

В идеале вы должны изменить конфигурацию XML только для создания @Controller bean и добавить к нему сеттер, чтобы установить AuthorDao из теста, используя свой макет.

person Sotirios Delimanolis    schedule 20.12.2013
comment
Я понял. Но я не могу сменить контроллер. Может быть, отражение мне поможет - person Constantine Gladky; 20.12.2013
comment
@ConstantineGladky Есть несколько альтернатив. Вот один. Вот еще один. И наконец, . - person Sotirios Delimanolis; 20.12.2013