Spring Boot Rest MVC. Мокито и будьте уверены. Не могу издеваться над экземпляром

У меня есть контроллер 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();
}

Это не работает. Мой тест не взаимодействует с mock. Похоже, что используется экземпляр валюты без издевательств.

UPD

Я сделал простой класс Currecy, чтобы выяснить, в чем проблема.

@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. Но это не работает.


person PaintedRed    schedule 15.04.2015    source источник
comment
Не могли бы вы опубликовать интерфейс валюты? Или хотя бы методы, которые использует Transactions?   -  person MarkOfHall    schedule 15.04.2015
comment
Транзакция вызывает buildTransaction и get, пока ваш тест ожидает и проверяет getBalance. Какие методы ожидают насмешек?   -  person MarkOfHall    schedule 15.04.2015


Ответы (2)


Я не думаю, что вам нужно использовать аннотацию @Autowired. Обычно я просто использую @Mock

person maximede    schedule 15.04.2015

Я нашел, что было не так. Вот исправленная часть кода

@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();
}
person PaintedRed    schedule 16.04.2015