所以我开始为Java-Spring项目编写测试.
我使用的是JUnit和Mockito.据说,当我使用when()... thenReturn()选项时,我可以模拟服务,而不需要模拟它们.所以我想做的是,设置:
when(classIwantToTest.object.get().methodWhichReturnsAList(input))thenReturn(ListcreatedInsideTheTestClass)
Run Code Online (Sandbox Code Playgroud)
但无论我在哪个when子句中,我总是得到一个NullpointerException,当然这是有意义的,因为输入是null.
当我尝试从对象模拟另一个方法时:
when(object.method()).thenReturn(true)
Run Code Online (Sandbox Code Playgroud)
在那里我也得到一个Nullpointer,因为该方法需要一个未设置的变量.
但我想使用when().. thenReturn()来绕过创建这个变量等等.我只是想确保,如果任何类调用此方法,那么无论如何,只返回true或上面的列表.
这是我身边的一个基本误解,还是有其他错误?
码:
public class classIWantToTest implements classIWantToTestFacade{
@Autowired
private SomeService myService;
@Override
public Optional<OutputData> getInformations(final InputData inputData) {
final Optional<OutputData> data = myService.getListWithData(inputData);
if (data.isPresent()) {
final List<ItemData> allData = data.get().getItemDatas();
//do something with the data and allData
return data;
}
return Optional.absent();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试类:
public class Test {
private InputData inputdata;
private ClassUnderTest classUnderTest;
final List<ItemData> allData = new ArrayList<ItemData>();
@Mock
private DeliveryItemData item1;
@Mock
private DeliveryItemData item2; …Run Code Online (Sandbox Code Playgroud) 所以我仍然在使用Mockito时遇到麻烦.所以我们假设我有以下类(请忽略它的逻辑或结构,它只是我从另一个类创建的一个简短示例,具有不同的名称等等.):
public class Restaurant(
@Autowired
private CustomerService customerService;
private CustomerInputData updateCustomer(CustomerInputData inputData){
String customerId = inputData.getID();
Customer customer = customerService.getCustomerById(customerID);
if(customer.getAddress() != null){
inputData.setCustomerName(customer.getCustomerName());
inputData.setCustomerCity(customer.getCustomerCity);
inputData.setCustomerLanguage(customer.getLanguage);
}
return inputData
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我对单元测试的理解是,隔离所有依赖项.在这里,我将拥有客户级和客户服务.
所以要写一个测试类,我现在会做以下事情:
public class RestaurantTest()
{
@Mock(name="customerService");
private CustomerService customerService;
@InjectMocks
private Restaurant classUnderTest;
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
}
@Test
public void updateCustomer_WithValidInput_ShouldReturnUpdatedInput(){
//Some Mocking first
String customerId = "customerId";
Customer customer = mock(Customer.class);
CustomerInputData = mock(CustomerInputData.class);
doReturn(customer).when(customerService.getCustomerById(any(String.class)));
doReturn(customerId).when(inputData.getId());
doReturn("address").when(customer.getAddress());
doReturn("Name").when(customer.getName());
doReturn("City").when(customer.getCity());
doReturn("Language").when(customer.getLanguage());
doNothing().when(inputData).setCustomerName(any(String.class));
doNothing().when(inputData).setCustomerCity(any(String.class));
doNothing().when(inputData).setCustomerLanguage(any(String.class));
verify(customer.getAddress(), atLeastOnce()); …Run Code Online (Sandbox Code Playgroud) 我这里有我的问题的简化版本。A类有一个受保护的方法。B类继承了这个方法。
public class A{
protected String getString(){
//some Code
}
}
public class B extends A{
public void doSomething(){
//someCode
String result = getString();
}
}
Run Code Online (Sandbox Code Playgroud)
我现在用 Mockito 编写一个单元测试,它位于另一个包测试中,我想测试该doSomething()方法。为此,我需要模拟 getString() 调用。由于该方法受到保护并且我的测试类位于不同的包中,因此我无法使用doReturn(...).when(classUnderTest).getString(). 问题是,我监视 B 类。所以我不能使用mock(new B(), Mockito.CALLS_REAL_METHODS).
我尝试通过反射获取受保护的方法:
Method getString = classUnderTest.getClass().getDeclaredMethod("getString");
getString.setAccessible(true);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在里面使用它doReturn()。
我在服务器上有多个JSON文件,它们只能运行批处理脚本或命令行工具.所有JSON文件都没有正确格式化,这意味着行的开头没有制表符空格.
有没有办法,编写批处理脚本或运行命令行工具来格式化文件,所以它们再次正常?
所以我有一个带有 Hybris、Spring 等的 web 项目。
我有一些类,它们是自动生成的。假设我有一个模型类,它是自动生成的并从另一个类继承一些方法来设置字段。
在编写单元测试时,开始使用 Builder 模式有用吗?因为问题是,我没有构造函数,比如 Employee(int id, String name) 等等,我只有继承的方法来设置它们(setId(int id) 等等)。
例如,当我为这个模型编写一个 Builder 类时,我会使用 .withId(int id) 和 .withName(String name) 以及 build() 方法,我将在其中运行 setter 方法。
所以最后在我的测试课上我会有:
EmployeeBuilder eb = new EmployeeBuilder();
Employee emp = eb.withId(123)
.withName("John")
.build();
Run Code Online (Sandbox Code Playgroud)
但是因为我已经有了 Setter-Methods 我通常有:
Employee emp = new Employee();
emp.setId(123);
emp.setName("John");
Run Code Online (Sandbox Code Playgroud)
那么在这种情况下真的值得付出努力吗?还是有什么我没有真正理解的地方?
谢谢!
好的,所以我显然不太了解doReturn(...).when(...)和when(...).thenReturn(...)之间的区别.
当我有一个类,我用@Mock注释Mocks并在我的类中注入@InjectMocks我想要测试然后在其中一个模拟中使用doReturn我得到一个UnfinishedStubbingException.但是当我使用的时候(...).然后返回(...)一切似乎都运行得很好.我认为doReturn更值得推荐,因为它并没有真正调用该方法(我猜这是(...).thenReturn(...)不会,因为该字段是模拟.)
所以这是一个例子:
doReturn(siteModel).when(siteService.getCurrentSite()) --> UnfinishedStubbingException
when(siteService.getCurrentSite()).thenReturn(siteModel) --> Works just fine
Run Code Online (Sandbox Code Playgroud) 我有一个简单的VueJS应用程序和Bootstrap的导航栏:
<template>
<header id="header">
<nav class="navbar mynavbar navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="logo" href="index.html"><img src="images/logo.png" alt=""></a>
</div>
<div class="collapse navbar-collapse" id="navbar-collapse">
<ul class="nav navbar-nav navbar-right">
<li><router-link to="/home"><a>Home</a></router-link></li>
<li><router-link to="/about"><a>About Us</a></router-link></li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container -->
</nav>
</header>
</template>
Run Code Online (Sandbox Code Playgroud)
现在我想确保在更改路径时,Bootstrap菜单关闭.完成此任务的最佳方法是什么?
javascript twitter-bootstrap twitter-bootstrap-3 vue.js vuejs2
我使用了一个 Angular 库,它有一个组件,它使用 CustomEvents 来调度一些东西,就像这样:
const domEvent = new CustomEvent('unselect', {
bubbles: true
});
this.elementRef.nativeElement.dispatchEvent(domEvent);
Run Code Online (Sandbox Code Playgroud)
如何在父组件中收听此事件?
我知道这是不鼓励的,我通常应该使用EventEmitters. 但是我无权覆盖子组件并且没有@Output定义事件。所以这是我唯一可以使用的东西。
我在继承和编写单元测试方面遇到问题。当我想测试的类继承该字段时,我不知道如何将模拟注入为字段。请注意,我无法存根任何内容,因为测试类是额外的测试包。我只想让myService.getSomething()-call 正常工作。
public class A{
@Autowired
private Service myService;
protected void doSomething(){
//
someValue = myService.getSomething();
}
Run Code Online (Sandbox Code Playgroud)
还有B类,它继承了以下方法:
public class B extends A{
public void someMethod(){
doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这将是我的测试类:
public class TestB{
@Mock
private Service myService;
@InjectMocks
private B classUnderTest = new B();
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testSomeMethod(){
SomeValue someValue = new SomeValue();
doReturn(someValue).when(myService).getSomething();
classUnderTest.doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助。
我有以下 Plunkr,它工作得很好。
https://plnkr.co/edit/WDjoEK7bAVpKSJbAmB9D?p=preview
它使用 lodash 的 _.differenceWith() 函数,将两个数组中不包含的所有数组值按顺序保存。
var result = _.differenceWith(data, test, _.isEqual);
Run Code Online (Sandbox Code Playgroud)
现在我有两个问题:
1.) 在我们的项目中,我们使用较旧的 Lodash 版本,其中未实现功能 differenceWith
2.) 我只需要比较数组的一个值。这当前比较完整的对象。我只需要比较 id 属性。
java ×6
mockito ×5
unit-testing ×4
javascript ×3
junit ×3
testing ×3
html ×2
mocking ×2
angular ×1
arrays ×1
batch-file ×1
builder ×1
command-line ×1
inheritance ×1
json ×1
lodash ×1
scripting ×1
stubbing ×1
typescript ×1
vue.js ×1
vuejs2 ×1