当前位置: 首页 > 知识库问答 >
问题:

从测试用例调用控制器时,使用自动连线组件测试控制器为空

杜焕
2023-03-14

我有控制器

@RestController
public class Create {

    @Autowired
    private ComponentThatDoesSomething something;

    @RequestMapping("/greeting")
    public String call() {
        something.updateCounter();
        return "Hello World " + something.getCounter();
    }

}

我有一个控制器的组件

@Component
public class ComponentThatDoesSomething {
    private int counter = 0;

    public void updateCounter () {
        counter++;
    }

    public int getCounter() {
        return counter;
    }
}

我还对我的控制器进行了测试。

@RunWith(SpringRunner.class)
@SpringBootTest
public class ForumsApplicationTests {

    @Test
    public void contextLoads() {
        Create subject = new Create();
        subject.call();
        subject.call();
        assertEquals(subject.call(), "Hello World 2");
    }

}

当控制器调用某个东西时,测试失败。updateCounter()。我得到一个空点异常。虽然我知道可以将@Autowired添加到构造函数中,但我想知道是否有必要使用@Autowired字段来实现这一点。如何确保@Autowired字段注释在我的测试中有效?

共有3个答案

慕容雅珺
2023-03-14

@Autowired类可以很容易地用带有正确注释的MockitoJUnitRunner进行模拟和测试。

有了这个,你可以做任何你需要做的单元测试模拟对象。

下面是一个快速的示例,它将使用来自不使用方法的组件的模拟数据来测试Create方法调用。

@RunWith(MockitoJUnitRunner.class)
public class CreateTest {

    @InjectMocks
    Create create;
    @Mock
    ComponentThatDoesSomething componentThatDoesSomething;

    @Test
    public void testCallWithCounterOf4() {

        when(componentThatDoesSomething.getCounter()).thenReturn(4);
        String result = create.call();
        assertEquals("Hello World 4", result);
    }
}
商冠玉
2023-03-14

使用Mockito并注入您创建的mock。我更喜欢:

@RestController
public class Create {

    private ComponentThatDoesSomething something;

    @Autowired
    public Create(ComponentThatDoesSomething c) {
        this.something = c;
    }
}

不要在Junit测试中使用Spring。

public CreateTest {

    private Create create;

    @Before
    public void setUp() {
        ComponentThatDoesSomething c = Mockito.mock(ComponentThatDoesSomething .class);
        this.create = new Create(c);
    } 
}
牛凌
2023-03-14

Spring不会自动连接您的组件,因为您使用new not with Spring实例化控制器,所以组件不会安装

SpringMockMvc测试检查它是否正确:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class CreateTest {
    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    @Before
    public void setup() {
        mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .build();
    }

    @Test
    public void testCall() throws Exception {
        //increment first time
        this.mvc.perform(get("/greeting"))
                .andExpect(status().isOk());
        //increment secont time and get response to check
        String contentAsString = this.mvc.perform(get("/greeting"))
                .andExpect(status().isOk()).andReturn()
                .getResponse().getContentAsString();
        assertEquals("Hello World 2", contentAsString);
    }
}
 类似资料:
  • 英文原文:http://emberjs.com/guides/testing/testing-controllers/ 单元测试方案和计算属性与之前单元测试基础中说明的相同,因为Ember.Controller集成自Ember.Object。 针对控制器的单元测试使用ember-qunit框架的moduleFor来做使这一切变得非常简单。 测试控制器操作 下面给出一个PostsController

  • spring-test模块对测试控制器@Controller提供了最原生的支持。详见14.6 "Spring MVC测试框架"一节。

  • 我有下一个Rest控制器 我将Spring Security用于以下配置: 我想为我的控制器编写单元测试。我写了下一个测试,但是它们工作得不好: 当我开始测试时,我得到了状态404。如果在安全配置中删除@EnableGlobalmetodSecurity(prePostEnable=true),测试正在工作,但不工作@PreAuthorize。我有一些问题: 如果prespenabled=true

  • 我试图测试我的一个控制器,它返回给我一个get方法上的对象列表,以填充我页面上的下拉列表。 我试图使用MockMvc和Hamcrest编写一个JUnit测试来测试相同的内容。 我想比较对象列表,并测试它是否失败。 这就是我获取模型属性的方式: 提前谢了。

  • 因此,我正在进行我的第一个Spring Boot项目,我一直在进行测试。我查了很多例子,但似乎都不管用。 这是我的控制器的当前测试: 这是可行的,但在sonarqube上,我发现我的代码覆盖率为0%,而我似乎找不到一个测试,它的覆盖率甚至超过了零。有谁能给我一个关于如何为控制器编写一个好的单元测试的例子,然后我就可以根据您的例子自己解决这个问题。 这是我的控制器: 这是我的服务(以防您需要): 还