上一篇主要讲的是仓库,例子是发送邮件。
说来惭愧,因为之前有面试时候问到是否有自己搭过本地仓库。本篇主要讲测试,例子是验证码:
- 上一篇和本篇的代码解释
- 聚合
- 继承
随着敏捷开发模式流行,单元测试重要性增大。Maven重要职责之一就是单元测试,它通过maven-surefire-plugin与主流的单元测试框架Junit3,Junit4以及TestNG集成,并能够生成丰富的结果报告。
例子主要处理账户注册时验证码的key生成、图片生成以及验证等。java代码大家自己在附件中下载:
这里附上核心代码:
1.使用com.google.code.kaptcha项目jar生成验证码图片
public byte[] generateCaptchaImage(String captchaKey) throws Exception { private DefaultKaptcha productor; BufferedImage image = productor.createImage(captchaKey); ByteArrayOutputStream out = new ByteArrayOutputStream(); try { ImageIO.write(image, "jpg", out); } catch (Exception e) { e.printStackTrace(); } return out.toByteArray(); }
其实上一篇里面也有些基础类,这里整理一下(发送邮件和解析xml写入xml):
2.使用spring3.x注解来注入发送邮件:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:service.properties" /> <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl" p:protocol="${email.protocol}" p:host="${email.host}" p:port="${email.port}" p:username="${email.username}" p:password="${email.password}"> <property name="javaMailProperties"> <props> <prop key="mail.${email.protocol}.auth">${email.auth}</prop> </props> </property> </bean> ....
具体发送邮件实现 java:
MimeMessage mimeMessage=javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper=new MimeMessageHelper(mimeMessage); messageHelper.setFrom(systemEmail); messageHelper.setTo(to); messageHelper.setSubject(subject); messageHelper.setText(htmlText,true); javaMailSender.send(mimeMessage);
3.根据文件名读取xml:
private Document readDocument(){ File dataFile = new File(file); if(!dataFile.exists()){ dataFile.getParentFile().mkdirs(); Document doc=DocumentFactory.getInstance().createDocument(); Element rootElement = doc.addElement(ELEMENT_ROOT); rootElement.addElement(ELEMENT_ACCOUNTS); writeDocument(doc); } try { return reader.read(new File(file)); 。。。 private void writeDocument(Document doc) { OutputStreamWriter out = null; try { out = new OutputStreamWriter(new FileOutputStream(file)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } XMLWriter writer = new XMLWriter(out, OutputFormat.createPrettyPrint()); try { writer.write(doc); } catch (IOException e) { e.printStackTrace(); }finally{ try {out.close();
4、读取xml并解析成对象:
public Account readAccount(String id) { Document document = readDocument(); Element element = document.getRootElement().element(ELEMENT_ACCOUNTS); for (Element ele : ((List<Element>)element.elements())) { if(ele.elementText(ACCOUNT_ID).equals(id)){ return buildAccount(ele); } } return null; } private Account buildAccount(Element ele) { Account account=new Account(); account.setId(ele.elementText(ACCOUNT_ID)); account.setName(ele.elementText(ACCOUNT_NAME)); 。。。聚合
场景:当我们有多个模块,我们会想要一次构建多个项目,而不是分别到两个模块目录下分别执行mvn命令。
实现:创建一个额外的名为account-aggregator模块,然后听过该模块构建整个项目的所有模块。aggregator作为一个maven项目,特殊的地方为<packaging>pom</packaging>
<artifactId>account-aggregator</artifactId> .... <packaging>pom</packaging> <modules> <module>../account-email</module> <module>../account-persist</module> ..1. 对于聚合模块,其打包方式packaging的值必须为pom,否则就无法创建。
2.可以通过在一个打包方式为pom的maven项目中声明任意数量的module元素来实现模块的聚合。
3.每个module的值都是一个当前pom的相对目录。所以说这里的account-email可以和实际它对应的artifactId不一致。
继承
场景:多个模块pom有着很多相同的配置,需要抽出重复的配置。
实现:一处声明,多出使用。和聚合模块一样,需要packaging为pom,我们定义他的artifactId为acount-parent,那么其它模块作为其子模块如下配置:
<parent> <groupId>com.ycq.account</groupId> <artifactId>account-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../account-aggregator/account-parent/pom.xml</relativePath> </parent>