invalid_visibility_annotation — public이 아닌 멤버에 붙은 가시성 어노테이션

invalid_visibility_annotation — public이 아닌 멤버에 붙은 가시성 어노테이션

visibleForTemplate이나 visibleForTesting 어노테이션이 private(비공개) 멤버에 적용될 때 나타나는 진단이에요. 이 어노테이션들이 왜 public 멤버에만 의미가 있는지, 어떻게 고치는지 살펴볼게요.

출처: invalid_visibility_annotation

본문

분석기는 visibleForTemplate 또는 visibleForTesting 어노테이션이 public이 아닌 선언에 적용될 때 이 진단을 내보내요.

private 멤버(예: _로 시작하는 멤버)는 원래부터 선언된 라이브러리 밖에서 참조할 수 없어요. 그런데 이 어노테이션들은 "다른 곳에서도 쓰일 수 있게 하되 특정 상황으로 제한한다"는 의미예요. 이미 밖에서 접근이 막힌 멤버에 이런 제한을 걸어봐야 아무 효과가 없으니, 의미가 없는 거죠.

예시

아래 코드가 이 진단을 만들어내요.

import 'package:meta/meta.dart';

@visibleForTesting
void _someFunction() {}

void f() => _someFunction();

_someFunction_로 시작해서 private이에요. 그런데 여기에 @visibleForTesting을 붙이니 "이미 테스트에서도 쓸 수 없는 멤버를 테스트 전용으로 표시"하는 모순이 생기는 거예요.

흔한 해결 방법

만약 이 선언이 테스트 코드에서 사용될 필요가 없다면, 어노테이션을 제거하면 돼요.

void _someFunction() {}

void f() => _someFunction();

반대로 테스트 코드에서 사용해야 한다면, 멤버를 public으로 바꿔 주면 돼요. _를 떼는 것만으로도 충분해요.

import 'package:meta/meta.dart';

@visibleForTesting
void someFunction() {}

void f() => someFunction();

여기서는 _someFunctionsomeFunction으로 바꿔 public으로 만들고, @visibleForTesting을 그대로 유지했어요. 이제 테스트 외의 일반 코드에서는 막히고, 테스트 코드에서는 쓸 수 있게 된 거예요.

더 알아보기

  • visibleForTesting 어노테이션에 대한 자세한 내용은 package:meta 문서를 참고하세요.
  • Dart의 private/public 구분은 라이브러리 단위로 이뤄진다는 점(언더스코어 _ 규칙)도 Dart 언어 투어 — 라이브러리 문서에서 함께 확인하면 좋아요.