Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Mockito.spy()  [new]
Molasar
Member

Откуда:
Сообщений: 756
Всем привет!

test1 проходит, т.е. происходит подмена настоящего Иванова на поддельного.
test2 выводит Иван Иванов has notified, т.е. подмена не происходит.

Как добиться подмены со вложенными компонентами?
public class UserDAOWithMockTest {

    private static final Map<Long, User> users = new HashMap<>();
    private static final UserDAO userDAO = Mockito.spy(UserDAO.class);
    private static final MyService myService = new MyService();

    static {
        users.put(1L, new User("Поддельный Иванов"));
    }
    
    @BeforeClass
    public static void setUpClass() {
        when(userDAO.getById(any(Long.class))).thenAnswer(
                (InvocationOnMock invocation)
                -> users.get((Long) invocation.getArgument(0)));
    }
    
    @Test
    public void test1() {
        assertEquals("Поддельный Иванов", userDAO.getById(1L).getName());
    }

    @Test
    public void test2() {
        myService.notifyUser(1L);
    }

}
public class User {

    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
public class UserDAO {

    private static final Map<Long, User> users = new HashMap<>();
    
    static {
        users.put(1L, new User("Иван Иванов"));
    }
    
    public User getById(Long id) {
        return users.get(id);
    }
    
}
public class MyService {
    
    private final UserDAO userDAO;

    public MyService() {
        this.userDAO = new UserDAO();
    }
    
    public void notifyUser(Long userId) {
        User user = userDAO.getById(userId);
        System.out.println(user.getName() + " has notified");
    }

}
8 окт 19, 16:18    [21989615]     Ответить | Цитировать Сообщить модератору
 Re: Mockito.spy()  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2539
@RunWith(SpringRunner.class)
@SpringBootTest
public class ControllerMockTest {

    @Mock
    private QuestionRepo questionRepo;
    @InjectMocks
    ControllerForTest controller;


    @Before
    public void setUp(){
        List<Question>list=new ArrayList<>();
        Question q1 = new Question();
        q1.setText("aaa");
        Question q2 = new Question();
        q2.setText("bbb");
        Question q3 = new Question();
        q3.setText("ссс");
        list.add(q1);
        list.add(q2);
        list.add(q3);
        when(questionRepo.findAll()).thenReturn(list);
    }
    @Test
    public void sss() {

        assertThat(controller.sss().size(), is(3));

    }
}

вот тока что писал как раз ,посмотри может поможет чем то
8 окт 19, 16:36    [21989645]     Ответить | Цитировать Сообщить модератору
 Re: Mockito.spy()  [new]
vas0
Member

Откуда: Таможенный союз (Россия, Казахстан)
Сообщений: 1279
Molasar
Всем привет!

test1 проходит, т.е. происходит подмена настоящего Иванова на поддельного.
test2 выводит Иван Иванов has notified, т.е. подмена не происходит.

Как добиться подмены со вложенными компонентами?
public class UserDAOWithMockTest {

    private static final UserDAO userDAO = Mockito.spy(UserDAO.class);
    private static final MyService myService = new MyService(userDAO); // ну так нужно его у сервиса подменить

}

public class MyService {
    
    private final UserDAO userDAO;

    public MyService() {
        this(new UserDAO());
    }

    public MyService(UserDAO userDAO) { // и тут конструктор
        this.userDAO = userDAO;
    }
}
8 окт 19, 16:44    [21989658]     Ответить | Цитировать Сообщить модератору
 Re: Mockito.spy()  [new]
Molasar
Member

Откуда:
Сообщений: 756
Вносить изменения в класс MyService нельзя.

vas0
Molasar
Всем привет!

test1 проходит, т.е. происходит подмена настоящего Иванова на поддельного.
test2 выводит Иван Иванов has notified, т.е. подмена не происходит.

Как добиться подмены со вложенными компонентами?
public class UserDAOWithMockTest {

    private static final UserDAO userDAO = Mockito.spy(UserDAO.class);
    private static final MyService myService = new MyService(userDAO); // ну так нужно его у сервиса подменить

}

public class MyService {
    
    private final UserDAO userDAO;

    public MyService() {
        this(new UserDAO());
    }

    public MyService(UserDAO userDAO) { // и тут конструктор
        this.userDAO = userDAO;
    }
}
8 окт 19, 17:00    [21989674]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить