Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'Null' is not a subtype of type 'Future<Either<Failure, NumberTrivia>>'

I am implementing the flutter project in TDD Clean Architecture by following this video: https://www.youtube.com/watch?v=lPkWX8xFthE&t=1s

my code:

class MockNumberTriviaRepository extends Mock
    implements NumberTriviaRepository {}

void main() {
  late MockNumberTriviaRepository mockNumberTriviaRepository;
  late GetConcreteNumberTrivia usecase;

  setUp(() {
    mockNumberTriviaRepository = MockNumberTriviaRepository();
    usecase = GetConcreteNumberTrivia(mockNumberTriviaRepository);
  });

  final tNumber = 1;
  final tNumberTrivia = NumberTrivia(text: 'test', number: 1);

  test(
    'should get trivia for the number from the repository',
    () async {
      //arrange
      when( mockNumberTriviaRepository.getConcreteNumberTrivia(1)).thenAnswer((_) async {
        return Right(tNumberTrivia);
      });

      //act
      final result = await usecase.execute(number: 10);

      //assert
      expect(result, Right(tNumberTrivia));
      verify(mockNumberTriviaRepository.getConcreteNumberTrivia(tNumber));
      verifyNoMoreInteractions(mockNumberTriviaRepository);
    },
  );
} 

when running the test it always comes results as

package:number_trivia/features/number_trivia/domain/repositories/number_trivia_repository.dart 7:41  MockNumberTriviaRepository.getConcreteNumberTrivia
test\features\number_trivia\domain\usecases\get_concrete_number_trivia_test.dart 27:40               main.<fn>
test\features\number_trivia\domain\usecases\get_concrete_number_trivia_test.dart 25:5                main.<fn>

type 'Null' is not a subtype of type 'Future<Either<Failure, NumberTrivia>>'

it shows an error here:

abstract class NumberTriviaRepository{
  Future<Either<Failure, NumberTrivia>> getConcreteNumberTrivia(int number);
}
class GetConcreteNumberTrivia {
 final NumberTriviaRepository repository;

 GetConcreteNumberTrivia(this.repository);

 Future<Either<Failure, NumberTrivia>> execute({required int number}) async {
   return await repository.getConcreteNumberTrivia(number);
 }
}

Please give me some solution to move forward.

like image 340
Akila Ishan Avatar asked Oct 19 '25 18:10

Akila Ishan


2 Answers

Here is the ResoCoder TDD Course null-safety version.

ResoCoder TDD Course (Null-safety)

Let me know if it helps.

like image 111
Thomas Viana Avatar answered Oct 22 '25 00:10

Thomas Viana


I faced the same error, I did some research and it finally worked for me.

You need to "Null" check, which if you encountered such an error.

To make Dart treat your code as null safe, the SDK constraints must require a language version that has null safety support. For example, your pubspec.yaml file might have the following constraints:

environment:
  sdk: ">=2.12.0 <3.0.0"

You should give the variable a nullable type by adding a question mark (?) after the type name

abstract class NumberTriviaRepository {
    Future<Either<Failure, NumberTrivia>>? getConcreateNumberTrivia(int number);
    Future<Either<Failure, NumberTrivia>>? getRandomNumberTrivia();
}

You have to use the functions in the "NumberTriviaRepository" when you call them.

class GetConcreateNumberTrivia {
  final NumberTriviaRepository repository;

  GetConcreateNumberTrivia(this.repository);

  Future<Either<Failure, NumberTrivia>?> execute({required int number}) async {
    return await repository.getConcreateNumberTrivia((number));
  }
}

I added a few useful links below. I hope your problem is solved.

Understanding null safety

Sound null safety

Practice with null safety

like image 24
erncncbk Avatar answered Oct 22 '25 00:10

erncncbk