2016-08-03 53 views
0

我打算做一个分析大的ArrayList的方法。我想在JUnit中编写测试方法。 ArrayList的大小可能高达数百万。我认为连接数据库并从那里获取数据进行分析并不是一个好主意,因为如果与数据库交谈,测试不是单元测试。那么我应该如何在这种情况下正确行事?或者一般的单元测试分析了多大的数据?如何通过Mockito模拟大ArrayList?

例子:

public void analyze(List<Double> list) { 

    double n1, n2, n3; 

    for (int i = 3; i < list.size(); i += 3) { 

     n1 = list.get(i - 3); 
     n2 = list.get(i - 2); 
     n3 = list.get(i - 1); 

     if (/* Some condition here using n1, n2, n3*/) { 
      list.remove(i); 
     } 
    } 
} 

@Test 
public void analyzeTest() { 

    List<Double> list = new ArrayList<Double>(); 

    // To add 1M data here. 

    analyze(list); 

    assertEquals(list, expected); 

} 
+0

请当您投反对票时发表评论。 – Vanguard

+0

为什么你需要一个模拟?在测试设置期间创建一个普通的'ArrayList'并且手动填充一百万个条目应该没问题。 –

+0

@DanielPryden我只是想将我的单元测试与数据库隔离开来。我只是想确保在这种情况下连接或不连接数据库是否正确。 – Vanguard

回答

2

测试是不一个单元测试是否与数据库对话

你说得对。

那么我该如何在这种情况下正确行事?

创建一个ArrayList对象并填充数据。然后根据这些数据进行测试,以确定您的生产代码按预期行事。您不需要数百万条目,只是覆盖analyze()不同情况的最低限度。

单元测试通常会分析多大的数据?

一个好的做法是,测试的多个层次:

  1. 单元测试 - 验证代码的逻辑,无需外部资源,如数据库。
  2. 集成测试 - 验证系统的不同部分(例如:数据库,Web服务器,api等)相互正确交互。
  3. 性能测试 - 验证您的系统在压力或大量数据下的行为。这里有特殊的工具(jMeter,gatling)。
-2

你好,你可以使用这样的: fleResult是您的数据库或服务对象,返回结果。 这类嘲笑作为方法PARAM

@Test 
public void testGetLogEvents(@Mocked final LogRecProcess fleResult, 

并添加@RunWith(JMockit.class)来测试类中,添加期望和返回示例数据作为阵列

new Expectations() { 
     { 
      fleResult.getEvents(); 
      result = Arrays.asList(new FilteredLogEvent[] { evnt }); 
     } 
    }; 
+1

错字,不可编译的代码,JMock的一些迹象以及OP询问的没有Mockito的迹象。这个答案似乎没有用处。 –

+0

我给出的答案不是完整的代码。没有给出有关解决该问题的代码。错别字有些人可以修复。你怎么说这似乎没有用处?除了错字之外的其他原因? – Anand