【问题标题】:How to change a field in controller for test?如何更改控制器中的字段进行测试?
【发布时间】:2018-02-10 05:26:06
【问题描述】:

我有下一个控制器:

@EnableWebMvc
@RequestMapping("experiences")
@RestController("experience_controller")
public class ExperienceController {

    @Autowired
    private ExperienceManager mExperienceManager;

    protected boolean mIsTest = false; //I need to replace by 'true'

    @PostMapping(value = "new")
    public ResponseEntity<ExperienceModel> add(
            @RequestBody NewExperienceModel newExperience
    ) {
        if (!mIsTest) {
            ExperienceUtils.validate(newExperience);
        }

        Experience experience = newExperience.toExperience();

        if (!mExperienceManager.add(experience)) {
            throw new InternalServerException(ServerError.INTERNAL);
        }

        return new ResponseEntity<>(new ExperienceModel(experience),
                HttpStatus.CREATED);
    }
}

还有我的应用测试类:

@TestPropertySource(properties = { "com.contedevel.virto.experience.controllers.ExperienceController.mIsTest=true" })
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ExperienceControllerTest {

    @Autowired
    private MockMvc mMockMvc;
    private ObjectMapper mMapper;
    private NewExperienceModel mModel;
    private String mExperienceId;

    @Before
    public void setUp() {
        mMapper = new ObjectMapper();
        UUID userId = UUID.randomUUID();
        UUID gameId = UUID.randomUUID();
        UUID achievementId = UUID.randomUUID();
        float value = 50f;
        mModel = new NewExperienceModel(userId, gameId, achievementId, value);
    }

    @Test()
    public void testOrder() throws Exception {
        testPost();
    }

    private void testPost() throws Exception {
        String json = mMapper.writeValueAsString(mModel);
        final String url = "/experiences/new";

        MvcResult result = mMockMvc.perform(post(url)
                .accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON)
                .content(json))
                .andDo(print())
                .andExpect(status().isCreated())
                .andReturn();
        String response = result.getResponse()
                .getContentAsString();
        JSONObject obj = new JSONObject(response);
        mExperienceId = obj.getString(ExperienceKeys.ID);
    }
}

我需要在我的控制器中设置mIsTest = true...当然,我知道这段代码是错误的,但是怎么做呢?还是每次都需要手动改?

【问题讨论】:

  • 您可以将 ExperienceUtils 更改为 bean 并注入一个模拟的用于测试。
  • @DanW,谢谢!老实说,我在 Spring 中是新手,但我会尝试了解如何编写自定义 bean。
  • 有一个基于代码的即时解决方案可以解决您当前的问题,但是想要将这样的逃生舱代码放入生产系统中会产生非常强烈的气味。

标签: java spring-mvc spring-boot spring-mvc-test


【解决方案1】:

使用@Value 怎么样?

public class ExperienceController {
    ...
    @Value("${flag.test:false}")
    protected boolean mIsTest;
    ...
}

以及测试代码

...
@TestPropertySource(properties = {"flag.test = true"})
public class ExperienceControllerTest {
   ...
}

mIsTest 的默认值为 false,您可以使用属性 flag.test(或其他)更改 mIsTest 的值。您可以使用属性文件和活动配置文件更改其值。

如果您想快速了解@Value,请参阅此处:http://www.baeldung.com/spring-value-annotation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2012-04-24
    • 2022-01-11
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多