MongoDB和模拟测试:更改MongoTemplate.save(obj)的参数

问题描述 投票:3回答:1

我使用MongoDB 3.2.1 + SpringDataMongoDB 1.8.2.RELEASEMockito 2.0.2-beta>。]

我有用户类别:

@Document(collection = "users")
public class User implements Serializable {
    @JsonView(UserView.Summary.class)
    @Id
    private String id;
    @JsonView(UserView.Summary.class)
    private String name;
    private String password;
    @JsonView(UserView.Summary.class)
    private String email;

    public User() { }

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

    public User(String name, String password, String email) {
        this.name = name;
        this.password = password;
        this.email = email;
    }
    // getters and setters
}

和DAO层(其中的一部分):

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private Logger LOGGER;
    @Autowired
    @Qualifier(value = "mongoTemplate")
    private MongoTemplate mongoTemplate;

    public User create(User user) {
        LOGGER.debug("UserDaoImpl.create: "+user);
        mongoTemplate.insert(user);
        return user;
    }
}

现在我要像这样模拟mongoTemplate

@Bean(name = "mongoTemplate")
public MongoTemplate getMongoTemplate() {
    MongoTemplate mongoTemplate = Mockito.mock(MongoTemplate.class);
    List<User> allUsers = new ArrayList<>();
    allUsers.add(new User("2323", "22", "[email protected]"));
    allUsers.add(new User("2323derfvb", "22234", "[email protected]"));
    Mockito.when(mongoTemplate.findAll(User.class)).thenReturn(allUsers);

    // **Don't work: it doesn't fill ID field for user**
    Mockito.doAnswer(invocation -> {
        Object[] args = invocation.getArguments();
        ((User) args[0]).setId("2342");
        return null;
    }).when(mongoTemplate).insert(User.class);

    return mongoTemplate;
}

不幸的是,我有一个问题。 mongoTemplate会在调用方法id时填充mongoTemplate.insert(user)字段,我可以从DAO中返回id字段作为答案。但是,如果模拟方法返回void,则Mockito

无法更改参数。我只能做:
Mockito.doNothing().when(mongoTemplate).insert(User.class);

在这种情况下,我不能更改user参数。链状

Mockito.doAnswer(invocation -> {
    Object[] args = invocation.getArguments();
    ((User) args[0]).setId("2342");
    return null;
}).doNothing().when(mongoTemplate).insert(User.class);

也无济于事。

谁能说我在这种情况下如何更改输入参数?

我使用MongoDB 3.2.1 + SpringDataMongoDB 1.8.2.RELEASE和Mockito 2.0.2-beta。我有User类:@Document(collection =“ users”)公共类User实现了可序列化的{@JsonView(UserView ....

java mongodb unit-testing spring-data spring-data-mongodb
1个回答
0
投票

我有与上述评论相同的问题。

© www.soinside.com 2019 - 2024. All rights reserved.