o github tah em manutenção hoje mesmo… =/
[quote=garcia-jj]Bean validator done. Só não consegui publicar porque hoje o github resolveu a me complicar. Nem mesmo consigo publicar um gist.[/quote]Q tal postar 1 exemplo agora?!!
Exemplo de uso? Será basicamente a mesma coisa que você já faz atualmente, porém é disponibilizado um método a mais na interface Validator.validate().
[code]@Resource
public class JSR303TestController {
private final Result result;
private final Validator validator;
public JSR303TestController(Result result, Validator validator) {
this.result = result;
this.validator = validator;
}
@Get
@Path("/303test")
public void edit() {
result.forwardTo("/WEB-INF/jspx/jsr303.jspx");
}
@Post
@Path("/303test")
public void store(MyBean myBean) {
validator.validate(myBean);
validator.onErrorUse(Results.logic()).forwardTo(getClass()).edit();
result.forwardTo("/WEB-INF/jspx/jsr303.jspx");
}
}[/code]
Eu não fiz os testes ainda, não sei mexer com esses mocks :twisted:
[quote=garcia-jj]…@Resource
...
public void store(MyBean myBean) {
validator.validate(myBean);
...
Eu não fiz os testes ainda, não sei mexer com esses mocks :twisted:[/quote]
É! Na verdade, é 1 falha minha não pesquisar isso. :oops: (Mas, é pq eu tô fazendo 1 intensivãozinho XP! :P)
Mas, o q eu gostaria de ver são as Validações na sua ‘MyBean’, as Annotations , coisa e tal …
Isso é coisa do Bean Validation e não do Vraptor. O Vraptor faz apenas um delegate para o Bean Validator. Você pode entender mais sobre ele aqui:
http://jcp.org/en/jsr/detail?id=303
http://people.redhat.com/~ebernard/validation/ (esse é o melhor)
Aqui como anotar os beans:
http://people.redhat.com/~ebernard/validation/#d0e5601
O “” pode/[color=red]deve[/color] ser ‘<input type=“submit”’??! O form tb funciona assim?:?: :arrow: Olha:
<form action="<c:url value="/produtos/adiciona"/>" ><!-- method="post" -->
Descrição<br />
<input type="text" name="produto.descricao" value="${produto.descricao}" /><br />
<input type="submit" value="Salvar" /><input type="button" name="_method" value="PUT">
<input type="submit" name="_method" value="DELETE">
</form>
não… é
<button type="submit" name="_method" value="PUT">Alterar</button>
e vc precisa colocar o method=“POST” no form
[quote=Lucas Cavalcanti]use os métodos HTTP do jeito certo (GET pra buscar/visualizar dados, POST pra adicionar, PUT pra adicionar/modificar e DELETE pra remover)
[/quote]Calma, gente! Calma! É apenas 1 projeto básico estendido do Blank (download) e do Tut. VRaptor3! -> É claro q ele não equivale 1 App Web do mundo real! Então (como v6 viram) tive q adicionar (ao Blank) 1 Tela de LogOn (inicialmente contra a minha vontade, mas acabou sendo bom|agregou muito valor) e o seu Form dava 1 Submit [color=red]direto[/color] p/ o Form do ‘Produtos’. Então p/ facilitar tive q colocar 1 tipo de HomePage(menu principal) entre os 2 p/ tentar implementar o OverLoad do manter(); (Obs.: Garcia, eu fiz 1 refactoring de form.JSP p/ marter.JSP).
Mesmo assim, o código ainda então: @Post
public void manter() {
}
@Get
public Produto manter(final Produto produto) {
return produto;
}
@Path("/produtos/{produto.id}") @Get//manter/ @Post
public Produto manter(Long id) {
return produtoSrvcFcd.recuperarPor(id);
}
mas, (não me lembro pq) não deu certo. Assim, em vez de usar o ‘manter(Long id)’ (-> Commented-Out), tive q usar o método ‘editar(Long id)’ (para o qual já tinha clonado editar.JSP de marter.JSP) para atender (execurar) a solicitação feita p/ Request e usar o ‘manter(Produto)’ só para fazer o Redirect adequado. (Ah, só ficou faltando adaptar o ‘editar(id)’ p/ abordagem RESTfarian8) ) Aí tudo funfou direitinho!!
Mas, vlws p/ ref.!!
[quote=Lucas Cavalcanti]não… é ;)[/quote](Ah, a tag ?! :roll: p/ ser sincero, nunca tinha usado.)
Oi, Lucas! Tô de volta…
Estive pesquisando s/ MSGs, <display tag; dei 1 googlada, mas nada q esgotasse os assuntos :/)
Achei muitos posts (c/ discussões) sobre Mensagens de Erro (Exceptions): porém, vc poderia me indicar Ref.s p/ abordagem só q das MSGs de [color=darkblue]Sucesso[/color] :?: ?!
E como vc sugere “jogar” a nossa Collection p/ a [color=red]Session[/color] p/ q a [color=red]paginação[/color] da <display tag funcione adequadamente, ou qual abordágem de Paginação vc sugere?! :-o
Depende muito do que você quer com tratamento de erros. Sugiro que você abra um reply no respectivo tópico para não misturar as coisas. Esse post tá bem “hibrido”, hehe.
qta pergunta ao mesmo tempo
[quote=derlon][quote=Lucas Cavalcanti]não… é ;)[/quote](Ah, a tag ?! :roll: p/ ser sincero, nunca tinha usado.)
Oi, Lucas! Tô de volta…
Estive pesquisando s/ MSGs, <display tag; dei 1 googlada, mas nada q esgotasse os assuntos :/)
Achei muitos posts (c/ discussões) sobre Mensagens de Erro (Exceptions): porém, vc poderia me indicar Ref.s p/ abordagem só q das MSGs de [color=darkblue]Sucesso[/color] :?: ?!
[/quote]
use uma convenção:
result.include("message", "...."); // nas lógicas
e sempre imprima essa mensagem na sua página, qdo ela existir, em uma cor diferente…
o mydvds faz isso
[quote=derlon]
E como vc sugere “jogar” a nossa Collection p/ a [color=red]Session[/color] p/ q a [color=red]paginação[/color] da <display tag funcione adequadamente, ou qual abordágem de Paginação vc sugere?! :-o [/quote]
ou vc ignora os parâmetros do display-tag e poe ele pra sempre bater na lógica de listagem (e sempre vai listar tudo), ou usa esses parâmetros pra fazer a paginação de verdade no banco
Vlws mesmo p/s dicas e sugestões!!
Mas… como vc sugere criar 1 Diretório/Pacote no Eclipse p/ implementarmos os Testes Unitários (digo: algo parecido como no netBeans)??! :roll:
Normalmente eu crio um pacote /src com os fontes Java da aplicação e um /test com os testes para rodar via JUnit.
Escuta, e qual é o problema de (se eu não usar [color=red]Mockery[/color]) eu instanciar a minha dependencia c/ new ClassOfLayer() assim:
[code]public class LogonControllerTestCase {
@Test(expected=ValidationException.class)
public void testValidacaoDeUsuarioInvalido()
{
/* Mockery mockery = new Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
ProdutoSrvcFcd dao = mockery.mock(ProdutoSrvcFcd.class); */
SessaoDoUsuario dao = new SessaoDoUsuario();
MockResult result = new MockResult();
LogonController controller = new LogonController(dao, result, new MockValidator() );
...;
// Assert.assertNull(result.included("msgFalha")); // estados
}
}
[/code] :?:
Ah, Lucas,
O código da ‘Listagem 16’ do artigo da MundoJava não explicita como a Instancia de alunoDao é(deveria ser) criada!
o problema de você não usar mocks é que vc não vai estar escrevendo testes unitários… se você está usando a implementação real de tudo, seus testes são funcionais, e vc não consegue testar comportamentos específicos da sua classe em teste…
acho que o artigo não explicita a criação das instâncias pq vc nunca vai criar instancias dos seus componentes na mão… vc sempre recebe no construtor e o vraptor se vira pra fazer isso…
Lucas,
(Num vô nem entrar no mérito da questão de Estilo de Teste: Classicista, ou Mockista, ou Behavorista(Comportalista)! (até p/ não ir OffTopic) :shock: )
Mas, então existe algum Mock para o Localization (p/ o caso de [color=red]Validação Internacionalizada[/color])??!
existe: mockery.mock(Localization.class)
é uma interface, vc pode mocká-la do jeito que vc quiser…
a gente só criou um MockResult e um MockValidator pq eles tem interfaces fluentes, e isso torna dificil mockar com os frameworks de mock existentes…
Bacana, Lucas!
Excelente v6 terem adicionado ‘MockResult’ e ‘MockValidator’ ao FrameWork :thumbup: …facilita muito a vida, mesmo p/ desenvolvedores q adotam o estilo clássico!!
Tenho 1 perguntinha 1/2 boba (mas, tb gostaria de saber os porquês): se, na minha Controller, eu tenho 1 método lista():
public List<Produto> lista() {
return produtoSrvcFcd.listaTodos(); //result.include("produtos", );
}
, no meu TestCase, eu não posso [color=red]testar assim[/color]:
...
List<Produto> produtos = produtosController.lista();
Assert.assertNotNull(result.included("produtoList"));
:?:
se o método retorna a lista, vc não precisa verificar o result, vc verifica o retorno mesmo
transformar o retorno em um atributo do result é responsabilidade do VRaptor, logo vc não precisa testar isso… (assim como vc não testa se a Session do hibernate está salvando mesmo o objeto no banco)
Normalmente eu crio um pacote /src com os fontes Java da aplicação e um /test com os testes para rodar via JUnit. [/quote]
Mas, desta forma, invariávelmente vou acabar com .JARs da Ferramenta de Test [color=red]misturados[/color] com os .JARs da minha Aplicação (e os .JARs dos FrameWorks adotados)??! :shock::?: