我正在尝试对使用3个域和服务来执行持久性的控制器进行测试,当我在视图中使用这些值时他正常保存,但在我的单元测试中没有通过验证,我做不明白为什么。如果有人在那里可以帮助我,我不知道我做的模拟是否正确,我按照文档oficial中的示例进行操作。
这就是错误信息:
junit.framework.AssertionFailedError: expected:<1> but was:<0>
这是我的测试代码:
@TestFor(UsuarioController)
@Mock([SecRole, UsuarioService, Usuario, Cliente, Secuser])
@TestMixin(ControllerUnitTestMixin)
class UsuarioTests {
private def usuarioCommand
private def service
@Before
void setUp() {
usuarioCommand = mockCommandObject(UsuarioCommand)
service = mockFor(UsuarioService)
}
@Test
void testCadastrarUsuarioCorreto() {
usuarioCommand.perfil = 2
usuarioCommand.nome = "Michael Swaltz"
usuarioCommand.cpf = "381.453.718-13"
usuarioCommand.email = "michael.s@mail.com"
usuarioCommand.login = "login"
usuarioCommand.senha = "senha"
usuarioCommand.senhaRepeat = "senha"
assertTrue( usuarioCommand.validate() );
controller.usuarioService = service
controller.create(usuarioCommand)
assertEquals(1, Usuario.count())
}
这是我的控制器动作:
def create = { UsuarioCommand usuario ->
if(!params.create) return
if(!usuario.hasErrors()) {
def secuser = new Secuser(username: usuario.login, password: usuario.senha, senha: usuario.senhaRepeat, enabled: true)
def user = new Usuario(nomeUsuario: usuario.nome, email: usuario.email, cpf: usuario.cpf, idNivelAcesso: usuario.perfil)
def cliente = Cliente.findByUsuario( session.usuario )
user.setIdCliente(cliente)
def secrole = SecRole.get( usuario.perfil )
try{
usuarioService.save(user, secuser, secrole)
flash.message = "Usuário ${usuario.nome} cadastrado.".toString()
redirect (action: 'list')
}catch(ValidationException ex) {
StringBuilder mensagem = new StringBuilder();
ex.errors.fieldErrors.each { FieldError field ->
mensagem.append("O campo ").append( field.field )
.append(" da classe ")
.append( field.objectName )
.append(" com o valor ")
.append( field.rejectedValue )
.append(" não passou na validação.")
.append("\n")
}
flash.error = mensagem.toString()
return [usr: usuario]
}catch(ex) {
flash.error = ex.message
render "Erro"
//return [usr: usuario]
}
}else {
usuario.errors.allErrors.each { println it }
render "Erro"
//return [usr: usuario]
}
}
答案 0 :(得分:4)
mockFor
会给你一个模拟控件。您必须在模拟控件上显式调用createMock()
以获取实际的模拟对象。
service = mockFor(UsuarioService).createMock()
从您引用的同一链接查看“模拟协作者”。如果您仍然遇到问题,可以优化测试。
答案 1 :(得分:1)
您需要在UsarioService上设置期望,以说明调用usarioService.save(...)时将返回的内容。
在达到这一点之前,你需要在测试中说出来 mockUsarioService.createMock()将创建模拟对象的实际实例,这是您将传递给控制器usarioService属性的内容。从Grails文档中复制下面的代码。 http://grails.org/doc/1.1/guide/9.%20Testing.html
String testId = "NH-12347686"
def otherControl = mockFor(OtherService)
otherControl.demand.newIdentifier(1..1) {-> return testId }
// Initialise the service and test the target method.
def testService = new MyService()
testService.otherService = otherControl.createMock()