当前位置: 首页 > 编程日记 > 正文

Java单元测试之JUnit4详解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Java单元测试之JUnit4详解

与JUnit3不同,JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有:

  • @BeforeClass 全局只会执行一次,而且是第一个运行
  • @Before 在测试方法运行之前运行
  • @Test  测试方法
  • @After  在测试方法运行之后允许
  • @AfterClass 全局只会执行一次,而且是最后一个运行
  • @Ignore 忽略此方法

下面举一个样例:

  1. import org.junit.After;  
  2. import org.junit.AfterClass;  
  3. import org.junit.Assert;  
  4. import org.junit.Before;  
  5. import org.junit.BeforeClass;  
  6. import org.junit.Ignore;  
  7. import org.junit.Test;  
  8. public class Junit4TestCase {  
  9. @BeforeClass  
  10. public static void setUpBeforeClass() {  
  11. System.out.println("Set up before class");  
  12. }
  13. @Before  
  14. public void setUp() throws Exception {  
  15. System.out.println("Set up");  
  16. }
  17. @Test  
  18. public void testMathPow() {  
  19. System.out.println("Test Math.pow");  
  20. Assert.assertEquals(4.0, Math.pow(2.0, 2.0), 0.0);  
  21. }
  22. @Test  
  23. public void testMathMin() {  
  24. System.out.println("Test Math.min");  
  25. Assert.assertEquals(2.0, Math.min(2.0, 4.0), 0.0);  
  26. }
  27. // 期望此方法抛出NullPointerException异常  
  28. @Test(expected = NullPointerException.class)  
  29. public void testException() {  
  30. System.out.println("Test exception");  
  31. Object obj = null;  
  32. obj.toString();
  33. }
  34. // 忽略此测试方法  
  35. @Ignore  
  36. @Test  
  37. public void testMathMax() {  
  38. Assert.fail("没有实现");  
  39. }
  40. // 使用“假设”来忽略测试方法  
  41. @Test  
  42. public void testAssume(){  
  43. System.out.println("Test assume");  
  44. // 当假设失败时,则会停止运行,但这并不会意味测试方法失败。  
  45. Assume.assumeTrue(false);  
  46. Assert.fail("没有实现");  
  47. }
  48. @After  
  49. public void tearDown() throws Exception {  
  50. System.out.println("Tear down");  
  51. }
  52. @AfterClass  
  53. public static void tearDownAfterClass() {  
  54. System.out.println("Tear down After class");  
  55. }
  56. }
  57. 单元测试是编写测试代码,用来检测特定的、明确的、细颗粒的功能。单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的。

    单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复、改进或重构之后的正确性。

    一般来说,单元测试任务包括

    1. 接口功能测试:用来保证接口功能的正确性。
    2. 局部数据结构测试(不常用):用来保证接口中的数据结构是正确的
      1. 比如变量有无初始值
      2. 变量是否溢出
    3. 边界条件测试
      1. 变量没有赋值(即为NULL)
      2. 变量是数值(或字符)
        1. 主要边界:最小值,最大值,无穷大(对于DOUBLE等)
        2. 溢出边界(期望异常或拒绝服务):最小值-1,最大值+1
        3. 临近边界:最小值+1,最大值-1
      3. 变量是字符串
        1. 引用“字符变量”的边界
        2. 空字符串
        3. 对字符串长度应用“数值变量”的边界
      4. 变量是集合
        1. 空集合
        2. 对集合的大小应用“数值变量”的边界
        3. 调整次序:升序、降序
      5. 变量有规律
        1. 比如对于Math.sqrt,给出n^2-1,和n^2+1的边界
    4. 所有独立执行通路测试:保证每一条代码,每个分支都经过测试
      1. 代码覆盖率
        1. 语句覆盖:保证每一个语句都执行到了
        2. 判定覆盖(分支覆盖):保证每一个分支都执行到
        3. 条件覆盖:保证每一个条件都覆盖到true和false(即if、while中的条件语句)
        4. 路径覆盖:保证每一个路径都覆盖到
      2. 相关软件
        1. Cobertura:语句覆盖
        2. Emma: Eclipse插件Eclemma
    5. 各条错误处理通路测试:保证每一个异常都经过测试

    JUNIT

    JUnit是Java单元测试框架,已经在Eclipse中默认安装。目前主流的有JUnit3和JUnit4。JUnit3中,测试用例需要继承TestCase类。JUnit4中,测试用例无需继承TestCase类,只需要使用@Test等注解。

    Junit3

    先看一个Junit3的样例

    1. // 测试java.lang.Math  
    2. // 必须继承TestCase  
    3. public class Junit3TestCase extends TestCase {  
    4. public Junit3TestCase() {  
    5. super();  
    6. }
    7. // 传入测试用例名称  
    8. public Junit3TestCase(String name) {  
    9. super(name);  
    10. }
    11. // 在每个Test运行之前运行  
    12. @Override  
    13. protected void setUp() throws Exception {  
    14. System.out.println("Set up");  
    15. }
    16. // 测试方法。  
    17. // 方法名称必须以test开头,没有参数,无返回值,是公开的,可以抛出异常  
    18. // 也即类似public void testXXX() throws Exception {}  
    19. public void testMathPow() {  
    20. System.out.println("Test Math.pow");  
    21. Assert.assertEquals(4.0, Math.pow(2.0, 2.0));  
    22. }
    23. public void testMathMin() {  
    24. System.out.println("Test Math.min");  
    25. Assert.assertEquals(2.0, Math.min(2.0, 4.0));  
    26. }
    27. // 在每个Test运行之后运行  
    28. @Override  
    29. protected void tearDown() throws Exception {  
    30. System.out.println("Tear down");  
    31. }
    32. }

    如果采用默认的TestSuite,则测试方法必须是public void testXXX() [throws Exception] {}的形式,并且不能存在依赖关系,因为测试方法的调用顺序是不可预知的。
    上例执行后,控制台会输出

    1. Set up
    2. Test Math.pow
    3. Tear down
    4. Set up
    5. Test Math.min
    6. Tear down

    从中,可以猜测到,对于每个测试方法,调用的形式是:

    1. testCase.setUp();
    2. testCase.testXXX();
    3. testCase.tearDown();

    运行测试方法

    在Eclipse中,可以直接在类名或测试方法上右击,在弹出的右击菜单中选择Run As -> JUnit Test。
    在Mvn中,可以直接通过mvn test命令运行测试用例。
    也可以通过Java方式调用,创建一个TestCase实例,然后重载runTest()方法,在其方法内调用测试方法(可以多个)。

    1. TestCase test = new Junit3TestCase("mathPow") {  
    2. // 重载  
    3. protected void runTest() throws Throwable {  
    4. testMathPow();
    5. };
    6. };
    7. test.run();

    更加便捷地,可以在创建TestCase实例时直接传入测试方法名称,JUnit会自动调用此测试方法,如

    1. TestCase test = new Junit3TestCase("testMathPow");  
    2. test.run();

    Junit TestSuite

    TestSuite是测试用例套件,能够运行过个测试方法。如果不指定TestSuite,会创建一个默认的TestSuite。默认TestSuite会扫描当前内中的所有测试方法,然后运行。
    如果不想采用默认的TestSuite,则可以自定义TestSuite。在TestCase中,可以通过静态方法suite()返回自定义的suite。

    1. import junit.framework.Assert;  
    2. import junit.framework.Test;  
    3. import junit.framework.TestCase;  
    4. import junit.framework.TestSuite;  
    5. public class Junit3TestCase extends TestCase {  
    6. //...  
    7. public static Test suite() {  
    8. System.out.println("create suite");  
    9. TestSuite suite = new TestSuite();  
    10. suite.addTest(new Junit3TestCase("testMathPow"));  
    11. return suite;  
    12. }
    13. }

    允许上述方法,控制台输出

    写道
    create suite
    Set up
    Test Math.pow
    Tear down

    并且只运行了testMathPow测试方法,而没有运行testMathMin测试方法。通过显式指定测试方法,可以控制测试执行的顺序。

    也可以通过Java的方式创建TestSuite,然后调用TestCase,如

    1. // 先创建TestSuite,再添加测试方法  
    2. TestSuite testSuite = new TestSuite();  
    3. testSuite.addTest(new Junit3TestCase("testMathPow"));  
    4. // 或者 传入Class,TestSuite会扫描其中的测试方法。  
    5. TestSuite testSuite = new TestSuite(Junit3TestCase.class,Junit3TestCase2.class,Junit3TestCase3.class);  
    6. // 运行testSuite  
    7. TestResult testResult = new TestResult();  
    8. testSuite.run(testResult);

    testResult中保存了很多测试数据,包括运行测试方法数目(runCount)等。

    如果细心的话,会发现Junit3的package是junit.framework,而Junit4是org.junit
    执行此用例后,控制台会输出

    写道
    Set up before class
    Set up
    Test Math.pow
    Tear down
    Set up
    Test Math.min
    Tear down
    Set up
    Test exception
    Tear down
    Set up
    Test assume
    Tear down
    Tear down After class

    可以看到,执行次序是@BeforeClass -> @Before -> @Test -> @After -> @Before -> @Test -> @After -> @AfterClass@Ignore会被忽略。

    运行测试方法

    与Junit3类似,可以在Eclipse中运行,也可以通过mvn test命令运行。

    Assert

    Junit3和Junit4都提供了一个Assert类(虽然package不同,但是大致差不多)。Assert类中定义了很多静态方法来进行断言。列表如下:

    • assertTrue(String message, boolean condition) 要求condition == true
    • assertFalse(String message, boolean condition) 要求condition == false
    • fail(String message) 必然失败,同样要求代码不可达
    • assertEquals(String message, XXX expected,XXX actual) 要求expected.equals(actual)
    • assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)
    • assertNotNull(String message, Object object) 要求object!=null
    • assertNull(String message, Object object) 要求object==null
    • assertSame(String message, Object expected, Object actual) 要求expected == actual
    • assertNotSame(String message, Object unexpected,Object actual) 要求expected != actual
    • assertThat(String reason, T actual, Matcher matcher) 要求matcher.matches(actual) == true

    Mock/Stub

    Mock和Stub是两种测试代码功能的方法。Mock测重于对功能的模拟。Stub测重于对功能的测试重现。比如对于List接口,Mock会直接对List进行模拟,而Stub会新建一个实现了List的TestList,在其中编写测试的代码。
    强烈建议优先选择Mock方式,因为Mock方式下,模拟代码与测试代码放在一起,易读性好,而且扩展性、灵活性都比Stub好。
    比较流行的Mock有:

    • JMock
    • EasyMock
    • Mockito
    • powermock

    其中EasyMock和Mockito对于Java接口使用接口代理的方式来模拟,对于Java类使用继承的方式来模拟(也即会创建一个新的Class类)。Mockito支持spy方式,可以对实例进行模拟。但它们都不能对静态方法和final类进行模拟,powermock通过修改字节码来支持了此功能。

    EasyMock

    IBM上有几篇介绍EasyMock使用方法和原理的文章:EasyMock 使用方法与原理剖析,使用 EasyMock 更轻松地进行测试。
    EasyMock把测试过程分为三步:录制、运行测试代码、验证期望。
    录制过程大概就是:期望method(params)执行times次(默认一次),返回result(可选),抛出exception异常(可选)。
    验证期望过程将会检查方法的调用次数。
    一个简单的样例是:

    1. @Test  
    2. public void testListInEasyMock() {  
    3. List list = EasyMock.createMock(List.class);  
    4. // 录制过程  
    5. // 期望方法list.set(0,1)执行2次,返回null,不抛出异常  
    6. expect1: EasyMock.expect(list.set(0, 1)).andReturn(null).times(2);  
    7. // 期望方法list.set(0,1)执行1次,返回null,不抛出异常  
    8. expect2: EasyMock.expect(list.set(0, 1)).andReturn(1);  
    9. // 执行测试代码  
    10. EasyMock.replay(list);
    11. // 执行list.set(0,1),匹配expect1期望,会返回null  
    12. Assert.assertNull(list.set(0, 1));  
    13. // 执行list.set(0,1),匹配expect1(因为expect1期望执行此方法2次),会返回null  
    14. Assert.assertNull(list.set(0, 1));  
    15. // 执行list.set(0,1),匹配expect2,会返回1  
    16. Assert.assertEquals(1, list.set(0, 1));  
    17. // 验证期望  
    18. EasyMock.verify(list);
    19. }

    EasyMock还支持严格的检查,要求执行的方法次序与期望的完全一致。

    Mockito

    Mockito是Google Code上的一个开源项目,Api相对于EasyMock更好友好。与EasyMock不同的是,Mockito没有录制过程,只需要在“运行测试代码”之前对接口进行Stub,也即设置方法的返回值或抛出的异常,然后直接运行测试代码,运行期间调用Mock的方法,会返回预先设置的返回值或抛出异常,最后再对测试代码进行验证。可以查看此文章了解两者的不同。
    官方提供了很多样例,基本上包括了所有功能,可以去看看。
    这里从官方样例中摘录几个典型的:

    • 验证调用行为
      1. import static org.mockito.Mockito.*;  
      2. //创建Mock  
      3. List mockedList = mock(List.class);  
      4. //使用Mock对象  
      5. mockedList.add("one");  
      6. mockedList.clear();
      7. //验证行为  
      8. verify(mockedList).add("one");  
      9. verify(mockedList).clear();
    • 对Mock对象进行Stub
      1. //也可以Mock具体的类,而不仅仅是接口  
      2. LinkedList mockedList = mock(LinkedList.class);  
      3. //Stub  
      4. when(mockedList.get(0)).thenReturn("first"); // 设置返回值  
      5. when(mockedList.get(1)).thenThrow(new RuntimeException()); // 抛出异常  
      6. //第一个会打印 "first"  
      7. System.out.println(mockedList.get(0));  
      8. //接下来会抛出runtime异常  
      9. System.out.println(mockedList.get(1));  
      10. //接下来会打印"null",这是因为没有stub get(999)  
      11. System.out.println(mockedList.get(999));  
      12. // 可以选择性地验证行为,比如只关心是否调用过get(0),而不关心是否调用过get(1)  
      13. verify(mockedList).get(0);  

    代码覆盖率

    比较流行的工具是Emma和Jacoco,Ecliplse插件有eclemma。eclemma2.0之前采用的是Emma,之后采用的是Jacoco。这里主要介绍一下Jacoco。Eclmama由于是Eclipse插件,所以非常易用,就不多做介绍了。

    Jacoco

    Jacoco可以嵌入到Ant、Maven中,也可以使用Java Agent技术监控任意Java程序,也可以使用Java Api来定制功能。
    Jacoco会监控JVM中的调用,生成监控结果(默认保存在jacoco.exec文件中),然后分析此结果,配合源代码生成覆盖率报告。需要注意的是:监控和分析这两步,必须使用相同的Class文件,否则由于Class不同,而无法定位到具体的方法,导致覆盖率均为0%。

    Java Agent嵌入

    首先,需要下载jacocoagent.jar文件,然后在Java程序启动参数后面加上 -javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2],具体的options可以在此页面找到。默认会在JVM关闭时(注意不能是kill -9),输出监控结果到jacoco.exec文件中,也可以通过socket来实时地输出监控报告(可以在Example代码中找到简单实现)。

    Java Report

    可以使用Ant、Mvn或Eclipse来分析jacoco.exec文件,也可以通过API来分析。

    1. public void createReport() throws Exception {  
    2. // 读取监控结果  
    3. final FileInputStream fis = new FileInputStream(new File("jacoco.exec"));  
    4. final ExecutionDataReader executionDataReader = new ExecutionDataReader(fis);  
    5. // 执行数据信息  
    6. ExecutionDataStore executionDataStore = new ExecutionDataStore();  
    7. // 会话信息  
    8. SessionInfoStore sessionInfoStore = new SessionInfoStore();  
    9. executionDataReader.setExecutionDataVisitor(executionDataStore);
    10. executionDataReader.setSessionInfoVisitor(sessionInfoStore);
    11. while (executionDataReader.read()) {  
    12. }
    13. fis.close();
    14. // 分析结构  
    15. final CoverageBuilder coverageBuilder = new CoverageBuilder();  
    16. final Analyzer analyzer = new Analyzer(executionDataStore, coverageBuilder);  
    17. // 传入监控时的Class文件目录,注意必须与监控时的一样  
    18. File classesDirectory = new File("classes");  
    19. analyzer.analyzeAll(classesDirectory);
    20. IBundleCoverage bundleCoverage = coverageBuilder.getBundle("Title");  
    21. // 输出报告  
    22. File reportDirectory = new File("report"); // 报告所在的目录  
    23. final HTMLFormatter htmlFormatter = new HTMLFormatter();  // HTML格式  
    24. final IReportVisitor visitor = htmlFormatter.createVisitor(new FileMultiReportOutput(reportDirectory));  
    25. // 必须先调用visitInfo  
    26. visitor.visitInfo(sessionInfoStore.getInfos(), executionDataStore.getContents());
    27. File sourceDirectory = new File("src"); // 源代码目录  
    28. // 遍历所有的源代码  
    29. // 如果不执行此过程,则在报告中只能看到方法名,但是无法查看具体的覆盖(因为没有源代码页面)  
    30. visitor.visitBundle(bundleCoverage, new DirectorySourceFileLocator(sourceDirectory, "utf-8", 4));  
    31. // 执行完毕  
    32. visitor.visitEnd();
    33. }

转载于:https://my.oschina.net/zhanghaiyang/blog/595048

相关文章:

Java 学习笔记 ------第二章 从JDK到IDE

本章学习目标: 了解与设定PATH了解与指定CLASSPATH了解与指定SOURCEPATH使用package与import管理类别初步认识JDK与IDE的对应关系一、第一个Java程序 工具:使用Windows自带记事本或下载其他编辑器(推荐NotePad和Sublime) //第一个…

Delphi中的容器类(二)

TStrings类 出于效率的考虑,Delphi并没有象C和Java那样将字符串定义为类,因此TList本身不能直接存储字符串,而字符串列表又是使用非常广泛的,为此Borland提供了TStrings类作为存储字符串的基类,应该说是它除了TList…

Java怎么把数组怎么放入set,如何将数组转换为Java中的Set

回答(16)2 years ago我从上面的建议中写下了以下内容 - 偷了它......真好!/*** Handy conversion to set*/public class SetUtil {/*** Convert some items to a set* param items items* param works on any type* return a hash set of the input items*/public s…

vue组件定义、组件的切换、组件的通信、渲染组件的几种方式(标签、路由、render)...

vue中全局的概念是什么?---就是全局定义的功能,所有实例化的vm都可以使用, 全局定义的是挂在构造函数Vue上面的,所以实例化出的对象都可以使用这个功能 1、什么是组件?---从UI的角度把页面拆分成不同的部分&#xff0…

JS九九乘法表

来一个老生常谈的话题--九九乘法表&#xff0c;哈哈&#xff0c;好久不写了呢 <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title><style>th{border: #ccc 1px solid;font-weight: n…

Php Fatal error: Allowed memory size of 33554432 bytes exhausted 的解决办法

Php Fatal error: Allowed memory size of 33554432 bytes exhausted 的解决办法 在 php.ini 配置文档里面&#xff0c;默认的memory_limit 属性值为32M &#xff0c;值设置得太小了而导致这个问题的出现。 解决这个问题&#xff0c;我们一般有三种方式&#xff1a; 1、修改PHP…

php 自加 性能,对于数据库的自增、自减心得

系统研发过程中会有很多地方涉及到自增、自减操作 如&#xff1a;加入版块时&#xff0c;用户版块数自增1&#xff0c;版块用户数自增1&#xff1b;退出版块时&#xff0c;用户版块数要减1&#xff0c;版块用户数也要减1这里推荐&#xff1a;1.自增可以用2.自减不要用&#xff…

Linux rsync目录同步功能实现

实现目标:A 服务器上 /opt/web 目录,与B服务器上 /opt/web目录实现同步。即&#xff1a;B主动与A进行同步。OS: Reaht AS4A Server 192.168.1.2 /opt/webB Server 192.168.1.3 /opt/web一. A Server config1.rsync 系统自带, 需要使用 --deamon 方式进行启动,服务端口是 TCP …

宏定义的布局约束

*自适应向布局约束的转化关闭*/ #define PREPCONSTRAINTS(VIEW) [VIEW setTranslatesAutoresizingMaskIntoConstraints:NO] #define CONSTRAIN(PARENT, VIEW, FORMAT) [PARENT addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:(FORMAT) options:0 metrics:nil…

项目中WebService使用Spring容器的配置

<context:component-scan base-package"com.huawei.support"> <context:include-filter type"annotation" expression"org.aspectj.lang.annotation.Aspect" /> </context:component-scan> 扫描采用注解…

java 静态代码块 多线程,Java多线程编程笔记10:单例模式

立即加载&#xff1a;“饿汉模式”立即加载就是指使用类的时候已经将对象创建完毕&#xff0c;常见的实现方法就是直接new实例化。也就是在调用方法前&#xff0c;实例就被创建了。示例代码如下所示&#xff1a;class MyObject{private static MyObject myObjectnew MyObject()…

创业笔记-Node.js入门之阻塞与非阻塞

阻塞与非阻塞 正如此前所提到的&#xff0c;当在请求处理程序中包括非阻塞操作时就会出问题。但是&#xff0c;在说这之前&#xff0c;我们先来看看什么是阻塞操作。 我不想去解释“阻塞”和“非阻塞”的具体含义&#xff0c;我们直接来看&#xff0c;当在请求处理程序中加入阻…

vs 添加ico图 到资源

有时候想用自己做的ico 文件作为程序的图标来取代VS 程序默认的图标&#xff1b;在VS2005 资源视图中&#xff0c;打开Icon 上右击-->Add resource -->Import -->选择自己的ico 文件会跳出个错误框&#xff0c;说VS不支持32 位彩色图片&#xff1b; 网上搜索说VS不支…

HIVE QL 杂记

最近要处理用户访问日志&#xff0c;需要从HIVE中取数据&#xff0c;写了一些HIVE QL&#xff0c;有一点小感想&#xff0c;记录在此。 1. 临时表 在HIVE中进行多表连接时&#xff0c;可以给一些临时表命名&#xff0c;这样有助于理清查询语句之间的逻辑&#xff0c;格式为&…

java和内存交互,java内存模型-内存间交互操作

前言本文是阅读周志明大佬的《深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践(第3版)》第12章&#xff0c;12.3节Java内存模型得来的读书笔记。阅读告警&#x1f602;&#x1f602;&#x1f602;&#xff0c;本文可能会有点枯燥&#xff0c;大部分内容都是对书中内容做一…

文件读写io操作范例

系统io读写&#xff0c;copy int main(int argc, char **argv) { if(argc ! 3) { printf("Usage: %s <src> <dst>\n", argv[0]); exit(0); } int fd1, fd2; fd1 open(argv[1], O_RDONLY); fd2 open(argv[2], O_CREAT | O_TRUNC | O_WRONLY); if(…

一步步教你编写redactor的插件

Redactor是一款JQuery框架下的所见即所得在线HTML编辑器&#xff0c;具有常用的功能如图片/文件上传、表格、格式化等等&#xff0c;不仅轻量级和跨浏览器&#xff0c;还支持各种平台如PC、Mac、iPad, iPhone、Android、Refrigerators&#xff0c;更重要的它能够自动保存、自动…

windows系统杀掉explorer.exe进程后黑屏

使用“Ctrl Shift ESC”打开任务管理器 文件----> 运行新任务---->运行explorer即可 转载于:https://www.cnblogs.com/mrnx2004/p/11065573.html

php 自动返回,PHP实现自动识别Restful API的返回内容类型

如题&#xff0c;PHP如何自动识别第三方Restful API的内容&#xff0c;自动渲染成 json、xml、html、serialize、csv、php等数据&#xff1f;其实这也不难&#xff0c;因为Rest API也是基于http协议的&#xff0c;只要我们按照协议走&#xff0c;就能做到自动化识别 API 的内容…

WebKit、Gecko使用图形库

2008年11月30日 星期日 上午 01:20阅读了之后&#xff0c;觉得作为浏览器内核WebKit、Gecko&#xff0c;为了能高效美观的显示页面的内容&#xff0c;选择适当的图形库非常重要。如果图形库选择不当&#xff0c;往往会导致页面上显示的文字、图片不美观&#xff0c;看起来总让人…

office使用技巧

Word绝招:一、 输入三个“”&#xff0c;回车&#xff0c;得到一条双直线&#xff1b;二、 输入三个“~”&#xff0c;回车&#xff0c;得到一条波浪线&#xff1b;三、 输入三个“*”或 “-”或 “#”&#xff0c;回车&#xff0c;惊喜多多&#xff1b;在单元格内输入now&…

怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记

C# matlab混合编程徐凯Email&#xff1a;xukai19871105http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html这几天突然想搞一搞以前没有搞定的MATLABC#混合编程&#xff0c;今天把原来编写的代码拿出来看看&#xff0c;然后结合网上一些正确的和一些错误的代码看看&#x…

【Android OpenGL ES】阅读hello-gl2代码(二)Java代码

AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.android.gl2jni"><applicationandroid:label"string/gl2jni_ac…

activiti任务TASK

一、概要 设计TASK的表主要是&#xff1a;ACT_RU_TASK&#xff0c;ACT_HI_TASKINST&#xff08;见参考-activiti表&#xff09;&#xff1b;任务主要有&#xff1a;人工任务&#xff08;usertask&#xff09;,服务任务&#xff08;servicetask&#xff09;等&#xff1b;候选人…

matlab数值分析拟合实例,数值分析函数拟合matlab代码.doc

数值分析函数拟合matlab代码.doc 第一题MATLAB代码用SPLINE作图XI0204060810YI098092081064038X10012Y1NEWTON3XI,YI,X源代码见M文件Y2SPLINEXI,YI,XPLOTXI,YI, O ,X,Y1, R ,X,Y2, K 用CSAPE作图XI0204060810YI098092081064038X10012Y1NEWTON3XI,YI,X源代码见M文件PPCSAPEXI,YI…

ArrayList Iterator remove java.lang.UnsupportedOperationException

在使用Arrays.asList()后调用add&#xff0c;remove这些method时出现 java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList&#xff0c; 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList&#xff0c;rem…

android中方法调用super(..)的相关知识

java中的多态有重写 方法被子类重写后 父类的原方法就会被隐藏 当你又需要调用父类所定义的原方法 这个时候就可以用super来调用super调用指向了父类&#xff0c;在一些调用里可以很巧妙的利用&#xff0c;比如监听返回键了在onKeyDown的方法里&#xff0c;如果想让系统对back…

在使用Reference Source调试.Net 源代码时如何取消optimizations(代码优化)-翻译

当你在使用Reference Source functionality in VS 2008 调试.Net 的源代码的时候&#xff0c;你会发现很多变量没法再调试时查看。 这是因为源代码服务器上提供的代码默认是为最终销售优化过的&#xff08;optimized &#xff09;。这些值虽然你没法查看&#xff0c;但不会阻断…

java旅游网站毕业论文,基于JAVA技术的旅游网站的开发.doc

摘要: 这次毕设主要是为了实现基于JAVA技术的旅游网站的开发&#xff0c;方便人们近距离的出行游玩。网站的开发过程中用到了很多方法技术&#xff0c;最主要的是JAVA技术&#xff0c;用于编写后台的功能实现代码&#xff1b;框架采用的是Spring MVC&#xff0c;作为轻量级企业…

Spring 实践 -IoC

Spring 实践标签&#xff1a; Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)为内核, 取代EJB的臃肿/低效/脱离现实. 主页http://spring.io/ IoC与DI IOC…