2015-12-03 2 views
1

Я изучаю весну и пишу простую весеннюю загрузку. Я хочу написать модульный тест для моего контроллера. Контроллер взаимодействует с репозиторием, который я хочу высмеять для целей теста. Использование различных руководств и документации я пришел к следующему:Spring mvc mock repository

Мой тест:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes={TestConfiguration.class,MyWebappApplication.class}) 
@WebAppConfiguration 
public class MyWebappApplicationTests { 

private MockMvc mockMvc; 

@Autowired 
private MyRepository myRepositoryMock; 

@Autowired 
private WebApplicationContext webApplicationContext; 

@Before 
public void setUp() { 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
} 

@Test 
public void contextLoads() throws Exception { 


    MyEntity e1 = new MyEntity(); 
    e1.setId(1); 
    e1.setDescription("e1"); 

    MyEntity e2 = new MyEntity(); 
    e2.setId(2); 
    e2.setDescription("e2"); 

    when(myRepositoryMock.findAll()).thenReturn(Arrays.asList(e1, w2)); 



    mockMvc.perform(get("/")) 
    .andExpect(status().isOk()); 

} 

}

Мой TestConfigiration, что обеспечивает фиктивный хранилищу:

@Configuration 
public class TestConfiguration { 

    @Bean 
    public MyRepository myRepository() { 
     return Mockito.mock(MyRepository.class); 
    } 

} 

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

Overriding bean definition for bean 'myRepository' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=2; dependencyCheck=0; autowireCandidate=true; primary=true; factoryBeanName=testContext; factoryMethodName=ideaRepository; initMethodName=null; destroyMethodName=(inferred); defined in murdoch.suppriseme.TestContext] with [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] 

Я попытался использовать аннотацию @Primary на bean-компоненте, чтобы иметь преимущество, но это не сработало. Что мне не хватает?

ответ

-1

В вашем тесте используется TestConfiguration.class, но ваш класс называется TestContext?

+0

Просто опечатка, я обновил вопрос. – 3urdoch

0

Вы должны быть в состоянии решить правильный экземпляр, придерживаясь @Qualifier

так

@Configuration 
public class TestConfiguration { 

    @Bean 
    @Qualifier("mock") 
    public MyRepository myRepository() { 
     return Mockito.mock(MyRepository.class); 
    } 

} 

и в тесте

@Autowired 
@Qualifier("mock") 
private MyRepository myRepositoryMock;