Java Spring mvc测试&x2B;莫基托@ModelAttribute空指针

Java Spring mvc测试&x2B;莫基托@ModelAttribute空指针,java,spring,junit,mockito,springmockito,Java,Spring,Junit,Mockito,Springmockito,我试图对一个简单的Spring MVC控制器进行单元测试,但即使是最简单的单元测试也会失败,因为@ModelAttribute抛出NullpointerException。我的问题是:如何模拟/设置ModelAttribute? 我尝试从存储库中模拟findAll()方法,但失败了 以下是我使用过的课程: TestContext: @Configuration public class TestContext { @Bean public MessageSource messageSource

我试图对一个简单的Spring MVC控制器进行单元测试,但即使是最简单的单元测试也会失败,因为
@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);
}
}
@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"));
}
}
StandaloneBenutzerController:

@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);
}
}
@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"));
}
}
@RunWith(MockitoJUnitRunner.class)
@SpringApplicationConfiguration(TestContext.class)
公共类标准控制器测试{
公共MockMvc-MockMvc;
@嘲弄
私有benutzerRepositoryMock;
@嘲弄
私人贝努策;
@以前
公共作废设置(){
this.benutzerRepositoryMock=Mockito.mock(BenutzerRepository.class);
InternalResourceViewResolver viewResolver=新的InternalResourceViewResolver();
setPrefix(“/WEB-INF/jsp/”);
setSuffix(“.jsp”);
Benutzer hauke=新的Benutzer(“测试”、“测试仪”、”test@tester.de");
List mockList=new ArrayList();
模拟列表。添加(豪克);
mockMvc=MockMvcBuilders.standaloneSetup(新的BenutzerController()).setViewResolver(viewResolver)
.build();
}
@试验
public void testSimpleStatus()引发异常{
Mockito.when(benutzer.getEmail())。然后返回(“test@tester.de");
//Mockito.when(benutzerRepositoryMock.findAll()).thenCallRealMethod();
//Mockito.when(benutzerRepositoryMock.findAll()).thenReturn(userList);
this.mockMvc.perform(get(“/verwaltung”))
.andExpect(状态().isOk())
.andExpect(forwardedUrl(“/WEB-INF/jsp/verwaltung.jsp”);
}
}
BenutzerController:抛出空指针的部分

@ModelAttribute("userList")
public List<Benutzer> userList() {
    return toList(repository.findAll());
}
@modeldattribute(“用户列表”)
公共列表用户列表(){
返回toList(repository.findAll());
}

该解决方案就像Si-mo暗示的那样,通过构造函数为测试的BenutzerController设置模拟存储库:

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

该解决方案就像Si mo暗示的那样,通过构造函数为测试的BenutzerController设置模拟存储库:

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

您必须在BenutzerControllery中设置模拟存储库您必须在BenutzerControllerI中设置模拟存储库我建议您使用setter或更好的构造函数来设置存储库。Spring允许您引入@Autowired构造函数。它们是注入依赖项和模拟的好选择<代码>公共类MyController(){MyDependencyOne;MyDependencyTwo;@Autowired public MyController(MyDependencyOne,MyDependencyTwo){this.one=one;this.two=two;}}我建议您使用setter或更好的构造函数来设置存储库。Spring允许您引入@Autowired构造函数。它们是注入依赖项和模拟的好选择<代码>公共类MyController(){MyDependencyOne;MyDependencyTwo;@Autowired public MyController(MyDependencyOne,MyDependencyTwo-two){this.one=one;this.two=two;}