Spring 引导休息 MVC。 Mockito 和放心。无法模拟实例
Spring Boot Rest MVC. Mockito and Rest Assured. Can't mock the instance
我有 Rest 控制器来构建事务
@RestController
@RequestMapping(value = "/transactions")
public class Transactions {
@Autowired
private Currency currency;
@RequestMapping(value = "/build", method = RequestMethod.POST)
@ResponseBody
public JsonData build(@RequestBody JsonNode json) throws Exception {
.......
System.out.println(currency.getBalance().get());
return result;
}
单元测试代码非常简单:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebIntegrationTest
@ActiveProfiles(profiles = "test")
public class TransactionsTest {
@Mock
@Autowired
private Currency currency;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); }
@Test
public void testBuild() {
json = ".......";
when(currency.getBalance()).thenReturn(Optional.of("7777"));
given().contentType(ContentType.JSON).body(json).when().post("/transactions/build/")
.then()
.statusCode(HttpStatus.SC_OK)
.body(Matchers.containsString("fee"));
verify(currency).getBalance();
}
没用。我的测试没有与模拟交互。看起来正在使用 Currency 的非模拟实例。
UPD
我做了一个简单的 class 货币来找出问题所在。
@Component
public class Currency {
public Optional<String> getBalance() {
System.out.println("Get Balance!!!!!");
return Optional.of("1111");
}
}
并更改了模拟:
when(currency.getBalance()).thenReturn(Optional.of("7777"));
在我的控制器中,我只调用了 getBalance,检查上面的代码。
我希望得到 7777 而不是 1111。但是它不起作用。
我认为您不需要使用@Autowired 注释。
我通常只使用@Mock
我发现哪里出了问题。
这是代码的固定部分
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@ActiveProfiles(profiles = "test")
public class TransactionsTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@Mock
private Currency currency;
@InjectMocks
private Transactions transactions;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
RestAssuredMockMvc.mockMvc = MockMvcBuilders.standaloneSetup(transactions).build();
}
我有 Rest 控制器来构建事务
@RestController
@RequestMapping(value = "/transactions")
public class Transactions {
@Autowired
private Currency currency;
@RequestMapping(value = "/build", method = RequestMethod.POST)
@ResponseBody
public JsonData build(@RequestBody JsonNode json) throws Exception {
.......
System.out.println(currency.getBalance().get());
return result;
}
单元测试代码非常简单:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebIntegrationTest
@ActiveProfiles(profiles = "test")
public class TransactionsTest {
@Mock
@Autowired
private Currency currency;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); }
@Test
public void testBuild() {
json = ".......";
when(currency.getBalance()).thenReturn(Optional.of("7777"));
given().contentType(ContentType.JSON).body(json).when().post("/transactions/build/")
.then()
.statusCode(HttpStatus.SC_OK)
.body(Matchers.containsString("fee"));
verify(currency).getBalance();
}
没用。我的测试没有与模拟交互。看起来正在使用 Currency 的非模拟实例。
UPD
我做了一个简单的 class 货币来找出问题所在。
@Component
public class Currency {
public Optional<String> getBalance() {
System.out.println("Get Balance!!!!!");
return Optional.of("1111");
}
}
并更改了模拟:
when(currency.getBalance()).thenReturn(Optional.of("7777"));
在我的控制器中,我只调用了 getBalance,检查上面的代码。 我希望得到 7777 而不是 1111。但是它不起作用。
我认为您不需要使用@Autowired 注释。 我通常只使用@Mock
我发现哪里出了问题。 这是代码的固定部分
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@ActiveProfiles(profiles = "test")
public class TransactionsTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@Mock
private Currency currency;
@InjectMocks
private Transactions transactions;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
RestAssuredMockMvc.mockMvc = MockMvcBuilders.standaloneSetup(transactions).build();
}