【问题标题】:Spring mvc test + mockito. @ModelAttribute NullPointerSpring mvc 测试 + 模拟。 @ModelAttribute 空指针
【发布时间】:2015-12-09 10:05:01
【问题描述】:

我正在尝试对一个简单的 Spring-MVC-Controller 进行单元测试,但即使是最简单的单元测试也会失败,因为 @ModelAttribute 会抛出 NullpointerException。我的问题是:如何模拟/设置ModelAttribute? 我尝试从存储库中模拟 findAll() 方法,但它失败了。

以下是我使用的类:

TestContext:

@Configuration
public class TestContext {

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("i18n/messages");
    messageSource.setUseCodeAsDefaultMessage(true);
    return messageSource;
}

@Bean
public BenutzerRepository benutzerRepository() {
    return Mockito.mock(BenutzerRepository.class);
}
}

StandaloneBenutzerController:

@RunWith(MockitoJUnitRunner.class)
@SpringApplicationConfiguration(TestContext.class)
public class StandaloneBenutzerControllerTest {

public MockMvc mockMvc;
@Mock
private BenutzerRepository benutzerRepositoryMock;
@Mock
private Benutzer benutzer;

@Before
public void setUp() {

    this.benutzerRepositoryMock = Mockito.mock(BenutzerRepository.class);
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/jsp/");
    viewResolver.setSuffix(".jsp");

    Benutzer hauke = new Benutzer("test","tester", "test@tester.de");
    List<Benutzer> mockList = new ArrayList<Benutzer>();

    mockList.add(hauke);
    mockMvc = MockMvcBuilders.standaloneSetup(new BenutzerController()).setViewResolvers(viewResolver)
            .build();
}

@Test
public void testSimpleStatus() throws Exception {

    Mockito.when(benutzer.getEmail()).thenReturn("test@tester.de");
    //Mockito.when(benutzerRepositoryMock.findAll()).thenCallRealMethod();
    //Mockito.when(benutzerRepositoryMock.findAll()).thenReturn(userList);

    this.mockMvc.perform(get("/verwaltung"))
            .andExpect(status().isOk())
            .andExpect(forwardedUrl("/WEB-INF/jsp/verwaltung.jsp"));
}
}

BenutzerController:抛出空指针的部分

@ModelAttribute("userList")
public List<Benutzer> userList() {
    return toList(repository.findAll());
}

【问题讨论】:

  • 你必须在你的 BenutzerController 中设置模拟存储库

标签: java spring junit mockito springmockito


【解决方案1】:

解决方案就像司墨提示通过构造函数为测试的BenutzerController设置mock仓库:

 mockMvc = MockMvcBuilders.standaloneSetup( new BenutzerController(benutzerRepositoryMock)).setViewResolvers(viewResolver).build();

【讨论】:

  • 我建议您使用 setter 甚至更好的构造函数来设置存储库。 Spring 允许您引入@Autowired 构造函数。它们是注入依赖项和模拟的不错选择。 public class MyController (){ MyDependencyOne one; MyDependencyTwo two ; @Autowired public MyController (MyDependencyOne one, MyDependencyTwo two){ this.one = one; this.two = two; } }
猜你喜欢
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 2014-08-25
  • 2021-11-28
  • 2018-08-27
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多