2016-05-19 5 views
0

как я могу инициализировать user, так что я могу сделать user.getUserId() без предупреждения об ошибках?Как избавиться от Mockito mock Uninitialized read findbugs warning

Uninitialized Считанные пользователя в новом .service.MockUserService() [.service.MockUserService] В MockUserService.java:[line 21]

public class MockUserService extends UserService { 

    public static final String FOO_USER_ID = "fooUser"; 

    @Mock 
    private User user; 


    public MockUserService() { 
     super(); 
     MockitoAnnotations.initMocks(this); 
     Mockito.when(user.getUserId()).thenReturn(FOO_USER_ID); 
    } 

    @Override 
    public User getUser() { 
     return getUserSafe(); 
    } 

    @Override 
    public User getUserSafe() { 
     return user; 
    } 
} 

ответ

1

Я не знаю много FindBugs , потому что я использую сонар. Для инструментов статического анализа кода я обычно считаю, что правила по умолчанию не всегда лучшие, поэтому я стараюсь их подстроить и обновить для нового шаблона разработки.

Во всяком случае для FindBugs, прибегая к помощи вокруг дали два возможных решения

  • Использование findbug аннотацию на каждом поле (FindBugs 3.0.0)

    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
        value="UR", 
        justification="This is an auto injected mock") 
    
  • Или установить фильтр, чтобы игнорировать Mock аннотацию ,

    <Match> 
        <Bug code="UR"> 
        <Field annotation="Mock"> 
    </Match> 
    

Обратите внимание, что оба эти псевдо-код, я пишу от смартфона. Таким образом, могут отсутствовать обязательные утверждения и/или правило (UR) может быть неправильным, описание ошибки находится на веб-сайте findbug.

Эти идеи в основном пришли из:

  1. Is there a way to ignore a single FindBugs warning?
  2. http://www.scriptscoop2.com/t/0044ed425b4f/java-how-to-set-a-findbugs-filter-for-fields-with-a-specific-annotation.html
  3. http://findbugs.sourceforge.net/bugDescriptions.html

Я хотел бы указать на то, что путь Mockito используется в этом примере кажется неправильным. Вот моя рекомендация:

  1. User - это либо объект, либо объект ценности, я настоятельно рекомендую не издеваться над такими классами. Для этого я предпочитаю использовать строителей. Обычно я ремесло тест строителя, который может быть использован как тот UserBuilder.userWithId(73L).build()
  2. И, наконец, вместо того, чтобы издеваться UserService вернуть предварительно сконфигурированной пользователю BDDMockito.given(user_service_mock.getUser()).willReturn(preconfigured_user)