Mockito.when().thenReturn() не отражается в функции @Component

Когда я использую следующий код в своем тестовом классе:

Mockito.when(accountHelper.convertAccountToJson(account)).thenReturn(jsonObject);

он возвращает jsonObject. Однако в моем AccountController следующий код возвращает значение null:

JSONObject accountJson = accountHelper.convertAccountToJson(account);

Может кто-нибудь объяснить, почему фиктивный ответ не отражается? Заранее спасибо.

Вот мой код: TestClass

 @RunWith(MockitoJUnitRunner.class)
    public class AccountControllerTest {

        @InjectMocks private AccountController accountController;
        @Mock private AccountHelper accountHelper;

        MockMvc mockMvc;

        @Before
        public void setup() throws Exception {
            MockitoAnnotations.initMocks(this);
            mockMvc = MockMvcBuilders.standaloneSetup(accountController).build();
        }

        @Test
        public void createAccountEmptyMessage() throws Exception{
            String jsonString = "{}";
            String expectedReturnBody = "{\"name\":"test"}";

            Account account = new Account(test);
            JSONObject jsonObject = new JSONObject("{\"name\":"test"}");

            Mockito.when(accountHelper.convertAccountToJson(account)).thenReturn(jsonObject);

            mockMvc.perform(post("/createAccount").contentType(MediaType.APPLICATION_JSON).characterEncoding("UTF-8")
                    .accept(MediaType.APPLICATION_JSON).content(jsonString))
                    .andExpect(content().string(expectedReturnBody));
        }
    }

HelperClass

@Component
public class AccountHelper {
    public JSONObject convertAccountToJson(Account account) {
    String jsonString;
    JSONObject json;

    Gson gson = new Gson();

    try{
        jsonString = gson.toJson(account);
        json = new JSONObject(jsonString);
        logger.info(jsonString);
    } catch (Exception e) {
        return null;
    }

    return json;
}

Контроллер

@RestController
public class AccountController {
    @Autowired private AccountService accountService;
    @Autowired private AccountHelper accountHelper;

    @RequestMapping(method = RequestMethod.POST, value = "/createAccount")
    public ResponseEntity<Object> createAccount(@RequestBody(required= false) Account account) {
        try {
            JSONObject accountJson = accountHelper.convertAccountToJson(account); //Return null

            //Create Account

            return new ResponseEntity(accountJson.toString(), HttpStatus.OK);

        } catch (Exception e) {
            return new ResponseEntity(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
}

person SL07    schedule 25.02.2017    source источник
comment
Трудно сказать, что здесь происходит. Можете ли вы отформатировать код лучше? Разделить разные классы на разные блоки?   -  person Christopher Schneider    schedule 25.02.2017
comment
Вы говорите своему макету вернуть этот jsonObject, когда он получит account. Так почему же он должен возвращать null, как ваша реальная реализация?   -  person QBrute    schedule 25.02.2017
comment
@ChristopherSchneider Я обновил вопрос по вашему запросу.   -  person SL07    schedule 25.02.2017
comment
@QBrute Я сделал ошибку, скопировав не тот раздел своего кода. Я обновил вопрос.   -  person SL07    schedule 25.02.2017
comment
Mockito.when(accountHelper.convertAccountToJson(any())).thenReturn(jsonObject); Вы можете заменить строку выше и проверить? Any() взят из пакета mockito. Я печатаю на телефоне, простите за опечатки и форматирование.   -  person harry    schedule 25.02.2017
comment
Я, по общему признанию, ничего не знаю об использовании MockMvc, но когда вы говорите when(accountHelper.convertAccountToJson(account)), вы говорите макету ожидать этот точный экземпляр account. Где этот экземпляр передается createAccount? Где-то должен быть createAccount(account), чтобы это работало.   -  person Christopher Schneider    schedule 25.02.2017
comment
@ChristopherSchneider Моя цель — передать этот экземпляр в createAccount.   -  person SL07    schedule 25.02.2017
comment
@harry Ваше решение работает. Почему any() работает в этом случае, но не указывает конкретный объект?   -  person SL07    schedule 25.02.2017
comment
Если вы используете any(), вам все равно, что это за объект. Я бы сказал, что использование any() , хотя и делает ваш тест пройденным, в данном случае является бесполезным тестом. Вы должны просмотреть этот ответ, чтобы увидеть, как на самом деле передать account Переменная. Обратите внимание на вызов метода .param().   -  person Christopher Schneider    schedule 25.02.2017
comment
@ChristopherSchneider согласился, что мой первый подход будет заключаться в том, чтобы заставить этот тестовый пример работать с любым, а затем вы можете использовать сопоставители с mockito. Если я правильно помню, есть выражение argThat с mockito   -  person harry    schedule 26.02.2017
comment
Да !! Сначала заставьте этот тест работать, а затем используйте пользовательские сопоставители !!! С мокито @SL07   -  person harry    schedule 26.02.2017
comment
когда(mockFoo.getBarByDouble(argThat(is(closeTo(1.0, 0.001))))). затемВозврат(mockBar); что-то из вышеперечисленных строк   -  person harry    schedule 26.02.2017
comment
Кажется, я знаю, где моя проблема. Учетная запись в моем AccountController — это RequestParam. По какой-то причине, когда я указываю Mockito.when(accountHelper.convertAccountToJson(account)).thenReturn(jsonObject); в своем тестовом классе, среда тестирования не может распознать, что учетная запись (в моем тестовом классе) является учетной записью @RequestBody (в моем контроллере). В результате макет не применяется. Все еще пытаюсь понять, как это исправить...   -  person SL07    schedule 27.02.2017