通过 id 服务对我的列表用户进行单元测试时比较不同类型的对象时出现 AssertionError

AssertionError on comparing different types of an object when unit testing my list user by id service

我正在尝试在我的 API 中测试一项服务,当给定某个 ID 时,它应该 return 对应于该 ID 的用户。非常简单,但我收到以下应该很容易修复但不知道如何修复的错误:

java.lang.AssertionError: 
Expecting:
 <User(id=89, name=null, email=null)>
and actual:
 <Optional[User(id=89, name=null, email=null)]>
to refer to the same object

我的测试代码是:

@RunWith(MockitoJUnitRunner.class)
public class ServiceDetailUserTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserDetailService userDetailService;

    @Test
    public void when_given_id_it_should_return_user() {
        User user = new User();
        user.setId(89L);

        when(userRepository.findById(user.getId())).thenReturn(Optional.of(user));

        Optional<User> expected = userDetailService.listUser(user.getId());

        assertThat(expected).isSameAs(user);
    }
}

我的服务代码(甚至不确定是否需要)是:

@Service
public class UserDetailService {

    @Autowired
    UserRepository repository;

    public Optional<User> listUser(Long id) {
        return repository.findById(id);
    }
}

所以,为了比较我的 expected 和我的 user,我需要它们是完全相同的类型...但是如何呢? 我见过这个测试的变体,其中一个使用表达式 assertThat(expected).isNotNull(); 而不是 assertThat(expected).isSameAs(user);,但我不确定这是否正确。

这应该有效:

@Test
public void when_given_id_it_should_return_user() {
    User user = new User();
    user.setId(89L);

    Optional<User> userMock = Optional.of(user);

    when(userRepository.findById(user.getId())).thenReturn(userMock);

    Optional<User> expected = userDetailService.listUser(user.getId());

    assertEquals(expected, userMock);
}

这比较了两个不同类型的实例,因为 expected 是一个 Optional,而 user 是一个 User:

assertThat(expected).isSameAs(user);

解包 expected.get(),或使用户成为可选的。