小编use*_*542的帖子

Mockito - 存根方法时的NullpointerException

所以我开始为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)

java testing junit mockito stubbing

49
推荐指数
11
解决办法
10万
查看次数

如何处理Mocks中的Setter/Getter-Methods?

所以我仍然在使用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)

java testing unit-testing mocking mockito

7
推荐指数
2
解决办法
2万
查看次数

模拟继承的受保护方法

我这里有我的问题的简化版本。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()

java junit unit-testing mockito

6
推荐指数
1
解决办法
9017
查看次数

Windows批处理 - 每个脚本的漂亮打印JSON

我在服务器上有多个JSON文件,它们只能运行批处理脚本或命令行工具.所有JSON文件都没有正确格式化,这意味着行的开头没有制表符空格.

有没有办法,编写批处理脚本或运行命令行工具来格式化文件,所以它们再次正常?

scripting command-line json batch-file

5
推荐指数
2
解决办法
6374
查看次数

Builder 模式对 Setter 方法有用吗?

所以我有一个带有 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)

那么在这种情况下真的值得付出努力吗?还是有什么我没有真正理解的地方?

谢谢!

java testing design-patterns builder builder-pattern

4
推荐指数
2
解决办法
6845
查看次数

DoReturn抛出UnfinishedStubbingException

好的,所以我显然不太了解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)

java unit-testing mocking mockito

3
推荐指数
1
解决办法
2677
查看次数

VueJS关闭路线改变的汉堡菜单

我有一个简单的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

3
推荐指数
3
解决办法
4852
查看次数

在 Angular 中监听自定义 DOM 事件

我使用了一个 Angular 库,它有一个组件,它使用 CustomEvents 来调度一些东西,就像这样:

const domEvent = new CustomEvent('unselect', {
   bubbles: true
});
 this.elementRef.nativeElement.dispatchEvent(domEvent);
Run Code Online (Sandbox Code Playgroud)

如何在父组件中收听此事件?

我知道这是不鼓励的,我通常应该使用EventEmitters. 但是我无权覆盖子组件并且没有@Output定义事件。所以这是我唯一可以使用的东西。

html javascript typescript angular

3
推荐指数
1
解决办法
4722
查看次数

模拟和注入继承字段

我在继承和编写单元测试方面遇到问题。当我想测试的类继承该字段时,我不知道如何将模拟注入为字段。请注意,我无法存根任何内容,因为测试类是额外的测试包。我只想让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)

谢谢你的帮助。

java inheritance junit unit-testing mockito

2
推荐指数
1
解决办法
4568
查看次数

找出两个数组之间的差异

我有以下 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 属性。

html javascript arrays lodash

2
推荐指数
1
解决办法
6465
查看次数